我想为每个元素添加一个id,如果元素多次出现,则应该在第一次出现时添加一个id,我不知道这个问题,有人可以帮助我
输入:
omg = ['a', 'b', 'c', 'a', 'b', 1]
输出:
omg_id = [0, 1, 2, 0, 1, 3]
答案 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))
两种解决方案都具有以下功能:
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]