python为列表中的每个元素添加一个id

时间:2018-07-22 10:07:03

标签: python list

我想为每个元素添加一个id,如果元素多次出现,则应该在第一次出现时添加一个id,我不知道这个问题,有人可以帮助我

输入:

omg = ['a', 'b', 'c', 'a', 'b', 1]

输出:

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

5 个答案:

答案 0 :(得分:9)

使用defaultdict:按出现顺序获取ID的小技巧:

from collections import defaultdict

omg = ['a', 'b', 'c', 'a', 'b', 1]
d = defaultdict(lambda: len(d))  # late binding allows d not to be defined yet
omg_id = [d[x] for x in omg]
# [0, 1, 2, 0, 1, 3]

默认工厂将当前已知密钥的数量分配给每个新密钥。由于键访问不仅返回而且还分配值,因此在理解过程中defaultdict会“增长”。

答案 1 :(得分:4)

您可以将迭代与字典配合使用以构建映射。然后将此映射应用于原始列表。

omg = ['a', 'b', 'c', 'a', 'b', 1]

d = {}
for i in omg:
    if i not in d:
        d[i] = len(d)

omg_id = list(map(d.get, omg))

print(omg_id)

[0, 1, 2, 0, 1, 3]

这是使用toolz.unique的替代解决方案[相当于unique_everseen文档中的itertools食谱]:

from toolz import unique

d = {v: k for k, v in enumerate(unique(omg))}
omg_id = list(map(d.get, omg))

两种解决方案都具有以下功能:

  • O(n)复杂性。
  • 要求omg的元素是可哈希的。

答案 2 :(得分:1)

使用列表中的项目创建一个集合。枚举集合,并创建一个包含枚举值键的字典。然后使用列表和字典产生所需的输出。

答案 3 :(得分:1)

您可以尝试以下方法:

from more_itertools import unique_everseen
t=dict([(e,c) for c,e in enumerate(unique_everseen(omg))])
print([t.get(e) for e in omg])

答案 4 :(得分:1)

Order dict将删除重复项并保留订单。您也可以通过以下操作一击完成:

from collections import OrderedDict

omg_id=[{v:k for k,v in enumerate(OrderedDict.fromkeys(omg))}[num] for num in omg]

结果:

[0, 1, 2, 0, 1, 3]