假设我有一个列表
l = ['michael','michael','alice','carter']
我想将其映射到以下内容:
k = [1,1,2,3]
其中michael对应于1,alice对应于2等。在Python中是否有一个函数可以轻松完成此任务?
答案 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)-96
将a-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]