我有一个清单,比方说
L = ['apple','bat','apple','car','pet','bat']
。
我想将其转换为
Lnew = [ 1,2,1,3,4,2]
。
每个唯一字符串都与一个数字相关联。
我有一个使用hashmap
的java解决方案,但我不知道如何在python中使用hashmap
。
请帮忙。
答案 0 :(得分:11)
这是一个快速解决方案:
l = ['apple','bat','apple','car','pet','bat']
创建一个将所有唯一字符串映射到整数的字典:
d = dict([(y,x+1) for x,y in enumerate(sorted(set(l)))])
将原始列表中的每个字符串映射到其各自的整数:
print [d[x] for x in l]
# [1, 2, 1, 3, 4, 2]
答案 1 :(得分:2)
x = list(set(L))
dic = dict(zip(x, list(range(1,len(x)+1))))
>>> [dic[v] for v in L]
[1, 2, 1, 3, 4, 2]
答案 2 :(得分:1)
您可以使用地图词典:
d = {'apple':1, 'bat':2, 'car':3, 'pet':4}
L = ['apple','bat','apple','car','pet','bat']
[d[x] for x in L] # [1, 2, 1, 3, 4, 2]
对于自动创建地图字典,您可以将defaultdict(int)
与计数器一起使用。
from collections import defaultdict
d = defaultdict(int)
co = 1
for x in L:
if not d[x]:
d[x] = co
co+=1
d # defaultdict(<class 'int'>, {'pet': 4, 'bat': 2, 'apple': 1, 'car': 3})
或者@Stuart提到你可以使用d = dict(zip(set(L), range(len(L))))
创建字典
答案 3 :(得分:1)
你也在Python中使用了一个hashmap,但我们称之为dict
。
>>> L = ['apple','bat','apple','car','pet','bat']
>>> idx = 1
>>> seen_first = {}
>>>
>>> for word in L:
... if word not in seen_first:
... seen_first[word] = idx
... idx += 1
...
>>> [seen_first[word] for word in L]
[1, 2, 1, 3, 4, 2]
答案 4 :(得分:0)
您可以尝试:
>>> L = ['apple','bat','apple','car','pet','bat']
>>> l_dict = dict(zip(set(L), range(len(L))))
>>> print l_dict
{'pet': 0, 'car': 1, 'bat': 2, 'apple': 3}
>>> [l_dict[x] for x in L]
[3, 2, 3, 1, 0, 2]
答案 5 :(得分:-2)
Lnew = []
for s in L:
Lnew.append(hash(s)) # hash(x) returns a unique int based on string