如何用数值替换列表中的字符串?

时间:2017-02-26 03:44:23

标签: python python-3.x

让我们说我有一个清单:

a = [['a','b'],['a','c'],['d','e'],['c','a']]

我需要它

a = [[1,2],[1,3],[4,5],[3,1]]

我尝试使用计数器更改值,但不起作用

3 个答案:

答案 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]]