让我们说我有一个清单:
a = [['a','b'],['a','c'],['d','e'],['c','a']]
我需要它
a = [[1,2],[1,3],[4,5],[3,1]]
我尝试使用计数器更改值,但不起作用
答案 0 :(得分:3)
如果您有列表列表而没有其他嵌套,这将有效。它不仅适用于任何长度的字符串,而且适用于所有可清洗类型。它还有一个好处,即无论使用哪个字符串,始终使用从0(或1)开始的连续索引:
someNumber[i]
它使用defaultdict
始终返回其未知项目的当前大小,因此始终生成唯一的整数。
答案 1 :(得分:0)
您还可以使用以下内容使用Gensims词典:
from gensim.corpora import Dictionary
a = [['a','b'],['a','c'],['d','e'],['c','a']]
# create Dictionary object
dic = Dictionary(a)
# map letters to tokens
def mapper(l):
# take in list and return numeric representation using Dic above
return map(lambda x: dic.token2id[x], l)
a2 = map(lambda x: mapper(x), a) # run mapper on each sublist to get letter id's
a2 # [[0, 1], [0, 2], [4, 3], [2, 0]]
如果你想用计数(词袋)转换为id,你可以使用:
map(lambda x: dic.doc2bow(x), a)
# [[(0, 1), (1, 1)], [(0, 1), (2, 1)], [(3, 1), (4, 1)], [(0, 1), (2, 1)]]
答案 2 :(得分:0)
如果您希望将其扩展为多字符字符串,Python会提供内置hash
函数,该函数碰撞的可能性很小:
a = [['a','b'],['a','c'],['d','e'],['c','a']]
b = [[hash(f), hash(s)] for f,s in a]
b
Out[11]:
[[-351532772472455791, 5901277274144560781],
[-351532772472455791, 791873246212810409],
[3322017449728496367, 3233520255652808905],
[791873246212810409, -351532772472455791]]
如果字符串是单个字符,我会定义一个翻译它们的函数,然后执行相同的列表理解:
def to_int(char):
return ord(char) - ord('a') + 1
b = [[to_int(f), to_int(s)] for f,s in a]
b
Out[14]: [[1, 2], [1, 3], [4, 5], [3, 1]]