将列表转换为ID列表

时间:2014-12-04 10:48:22

标签: python list python-3.x

Python 3.3:

从列表中获取最简单的方法是什么:

input = ["A", 112, "apple", 74, 112]

以下列表:

output = [0, 1, 2, 3, 1]

即,将从0开始的自动递增id分配给每个唯一条目,并将原始列表转换为此ID列表。

我知道,我可以通过

获得便宜的课程数量
number_of_classes = len(set(input))

但是如何创建正确排序的输出?

5 个答案:

答案 0 :(得分:13)

您可以使用列表推导来创建元素 first 在该列表中出现的索引列表。

对于输入列表i = ["A", 112, "apple", 74, 112]

>>> [i.index(value) for value in i]
[0, 1, 2, 3, 1]

答案 1 :(得分:3)

除了@ajcr回答,这对于小列表来说很好,这里有解决方案具有linerar计算复杂性(使用list.index()时有O(n ^ 2)):

data = ["A", 112, "apple", 74, 112]
index = {val: i for i, val in reversed(list(enumerate(data)))}
indexes = [index[x] for x in data]
indexed = [(x, index[x]) for x in data]

print index
print indexes
print indexed

答案 2 :(得分:1)

只需使用键保留另一个列表,并使用array.index()方法获取项目的索引:

input = ["A", 112, "apple", 74, 112]
keys = []
output = []

for item in input:
   if item not in keys:
      keys.append(item)
   output.append(keys.index(item))

print output

答案 3 :(得分:0)

使用字典:

input = ["A", 112, "apple", 74, 112]
dictMap = dict((i[1],i[0]) for i in enumerate(set(input)))
print [dictMap[i] for i in input]

输出:

[0, 1, 3, 2, 1]

答案 4 :(得分:0)

>>> input = ["A", 112, "apple", 74, 112]
>>> my_dict = {x:i for i,x in enumerate(sorted(set(input),key=input.index))}  # need to as set dosent remember order
>>> my_dict
{'A': 0, 112: 1, 74: 3, 'apple': 2}
>>> [ my_dict[x] for x in input ]
[0, 1, 2, 3, 1]