我有一个如下所示的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中有直接的方法吗?
答案 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]
逻辑
我们删除原始列表中的重复值(同时保留顺序)。然后我们找到列表中与原始列表相关的各个项目的索引。
优点
缺点
答案 2 :(得分:1)
使用collections.defaultdict
和itertools.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]