为列表条目提供索引

时间:2015-07-21 19:21:19

标签: python list

我有一个如下所示的Python列表:

A1 = ['a','a','a','foo','c','d','a','e','bar','bar','bar','e','d','d']

我想把它变成这个......

A2 = [1,1,1,2,3,4,1,5,6,6,6,5,4,4]

... A1中的条目按顺序排列,并在A2中给出增量索引。

在Python中有直接的方法吗?

5 个答案:

答案 0 :(得分:5)

index_map = {}
result = []

i = 0 # or 1 or whatever

for value in A1:
    if value not in index_map:
        index_map[value] = i
        i = i + 1
    result.append(index_map[value])

答案 1 :(得分:1)

其中一种方法可以是。

>>> A1 = ['a','a','a','foo','c','d','a','e','bar','bar','bar','e','d','d']
>>> ref = []
>>> for i in A1:
...    if i not in ref:
...        ref.append(i)
... 
>>> [ref.index(i)+1 for i in A1]
[1, 1, 1, 2, 3, 4, 1, 5, 6, 6, 6, 5, 4, 4]

逻辑

我们删除原始列表中的重复值(同时保留顺序)。然后我们找到列表中与原始列表相关的各个项目的索引。

优点

  • 简单概念/初级水平
  • 非常直截了当。

缺点

  • 慢,因为它的顺序是O(n 2

答案 2 :(得分:1)

使用collections.defaultdictitertools.count创建一个字典,根据需要为每个新密钥生成唯一ID:

>>> unique_ids = collections.defaultdict(itertools.count(start=1).next)
>>> [unique_ids[item] for item in A1]
[1, 1, 1, 2, 3, 4, 1, 5, 6, 6, 6, 5, 4, 4]

答案 3 :(得分:1)

虽然类似于Bhargav Rao的回答,但对于较长的阵列(特别是具有大量独特元素)而言,考虑到使用散列,这可能会更快。

A1 = ['a','a','a','foo','c','d','a','e','bar','bar','bar','e','d','d']
uniqueEntries = 0
ref = {}
A2 = []
for x in A1:
    if x not in ref:
        uniqueEntries += 1
        ref[x] = uniqueEntries
    A2.append(ref[x])

编辑:当然你可以预先分配" A2 = [0] * len(A1)"如果你愿意,虽然它不应该改变算法的渐近性质。

答案 4 :(得分:-1)

这可能会伤到你的眼睛,但它有效,只需使用sets

[list(set(your_list)).index(x) for x in your_list]