Python映射字符串列表到整数列表

时间:2012-02-09 06:54:45

标签: python

假设我有一个列表

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

我想将其映射到以下内容:

k = [1,1,2,3]

其中michael对应于1,alice对应于2等。在Python中是否有一个函数可以轻松完成此任务?

9 个答案:

答案 0 :(得分:10)

查看ord,其中给出了给定角色的unicode编号:

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

因此,您可以ord(x)-96a-z转换为1-26(小心大写等)。

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

再次注意大写字母和非字母字符。

答案 1 :(得分:5)

为了回答编辑过的问题,即将字符串列表映射到唯一整数,必须首先找到唯一字符串,然后将字符串映射到原始字符串列表中的整数。例如,

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

然后唯一字符串为{'michael','alice','carter'}。现在,使用字典{'michael','alice','carter'} =[1,2,3]通过1-1映射将这些字符串转换为整数,如{'michael':1,'alice':2,'carter':3}。在第三步中,循环遍历原始字符串列表;在字典中搜索相应整数的字符串,并用该整数替换字符串。

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])

输出:

k=[1, 1, 2, 3]

答案 2 :(得分:3)

要将整数列表映射到字符串列表,我会使用字典,例如:

> name_number = {'michael':1, 'michael':1, 'alice':2, 'carter':3}
> print len(name_number)
  3
> print name_number['alice']
  2

请注意,len(name_number)3,因为不允许使用重复的密钥。

答案 3 :(得分:3)

使用熊猫怎么样? import pandas as pd l = ['michael','michael','alice','carter'] pd.Series(l).astype('category').cat.codes.values

答案 4 :(得分:2)

如果我正确地读你,你想要一个字符列表并将它们转换为整数,其中1为b,2为2,等等。

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

upper()扔到那里,无论它们是大写还是更低都无关紧要。

答案 5 :(得分:1)

该功能为zip

E.g:

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

如果要将l的项目用作索引,则需要字典:

>>> d = dict(zip(l,k))
>>> d
{'a': 1, 'c': 3, 'b': 2}
>>> d['a']
1
>>> d['c']
3
>>> 

答案 6 :(得分:0)

没有功能,

可以很容易地做到:

j - list()    
for i in range (len(l)) : 
   j.append((l[i],k[i]))

答案 7 :(得分:0)

根据你的问题,目前尚不清楚你是想根据l生成k还是同时生成l和k。

如果你想根据l创建k,@ mathematical.coffee应该这样做。

如果你想要一张l到k项的地图,很明显,l中的项目应该是唯一的。

看看这是否是你想要的

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

否则,如果您正在寻找元组:

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

答案 8 :(得分:0)

如果您不关心分配的ID的顺序,则可以这样做:

# 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]

输出:

[2, 2, 1, 3]