在Python中将唯一字符串映射到整数

时间:2017-04-04 09:25:43

标签: python

我有一个清单,比方说 L = ['apple','bat','apple','car','pet','bat']

我想将其转换为 Lnew = [ 1,2,1,3,4,2]

每个唯一字符串都与一个数字相关联。

我有一个使用hashmap的java解决方案,但我不知道如何在python中使用hashmap。 请帮忙。

6 个答案:

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