Python Map List of Strings to Integer List

后端 未结 9 1235
猫巷女王i
猫巷女王i 2020-12-31 23:05

Let\'s say I have a list

l = [\'michael\',\'michael\',\'alice\',\'carter\']

I want to map it to the following:

k = [1,1,2,3         


        
相关标签:
9条回答
  • 2020-12-31 23:21

    Have a look at ord, which gives the unicode number for a given character:

    >>> letters = ['a','b','c','d','e','f','g']
    >>> [ord(x) for x in letters]
    [97, 98, 99, 100, 101, 102, 103]
    

    So you could do ord(x)-96 to convert a-z to 1-26 (careful about upper case, etc).

    l = ['a','b','a','c']
    k = [ord(x)-96 for x in l] # [1,2,1,3]
    

    Again, careful about upper case and non-alphabet characters.

    0 讨论(0)
  • 2020-12-31 23:27

    The function is zip

    E.g:

    >>> l = ['a','b','a','c']
    >>> k = [1,2,1,3]¨
    >>> zip(l,k)
    [('a', 1), ('b', 2), ('a', 1), ('c', 3)]
    

    If you want to use the items of l as index, you want an dictionary:

    >>> d = dict(zip(l,k))
    >>> d
    {'a': 1, 'c': 3, 'b': 2}
    >>> d['a']
    1
    >>> d['c']
    3
    >>> 
    
    0 讨论(0)
  • 2020-12-31 23:30

    In order to answer the edited question, i.e., to map the list of strings to unique integers, one has to first find the unique strings and then do 1-1 mapping of the strings to integers in the original list of strings. For example,

    s = ['michael','michael','alice','carter']
    

    then unique strings are {'michael','alice','carter'}. Now, convert these strings to integers by 1-1 mapping like {'michael','alice','carter'} =[1,2,3] using dictionary {'michael':1,'alice':2,'carter':3}. In the third step, loop through the original list of strings; search the string in the dictionary for the corresponding integer and replace the string by that integer.

    s=['michael','michael','alice','carter']
    
    mydict={}
    i = 0
    for item in s:
        if(i>0 and item in mydict):
            continue
        else:    
           i = i+1
           mydict[item] = i
    
    k=[]
    for item in s:
        k.append(mydict[item])
    

    Output:

    k=[1, 1, 2, 3]
    
    0 讨论(0)
  • 2020-12-31 23:31

    If I'm reading you correctly, you want to take a list of characters and convert them to integers, with a being 1, b being 2, etc.

    l = ['a','b','a','c']
    k = [ord(x.upper()) - 64 for x in l]
    

    Threw the upper() in there so it doesn't matter whether they're upper case or lower.

    0 讨论(0)
  • 2020-12-31 23:39

    From your question it is not clear if you want to generate k based on l or both l and k are given.

    If you are looking to create k based on l, @mathematical.coffee's answer should do.

    If you want a map from items in l to k, obviously, your items in l should be unique.

    See if this is what you were looking for

    dict((l[index], k[index]) for index in range(len(l)))
    

    Or else, if you are looking for tuples:

    [(l[index], k[index]) for index in range(len(l))]
    
    0 讨论(0)
  • 2020-12-31 23:43

    If you don't care about the order of the assigned ids, this works:

    # create unique list of  names
    unique_l = set(l)
    
    # create mappings from names to id
    name2id = {name: idx+1 for idx, name in enumerate(unique_l)}
    
    # map initial list of names to ids
    k = [name2id[name] for name in l]
    

    Output:

    [2, 2, 1, 3]
    
    0 讨论(0)
提交回复
热议问题