我希望以一种允许我以相同方式更改另一个相应列表的方式删除python列表中的重复项。在下面的示例中,original
是我要删除的列表。 key
中与原始索引共享相同索引的每个元素彼此对应:
original = [a,a,a,3,4,5,b,2,b]
key = [h,f,g,5,e,6,u,z,t]
所以我想删除original
中的重复项,这样我从原文中删除的任何元素都会删除key
中相应的元素(相同索引)。结果我想:
deduplicated_original = [a,3,4,5,b,2]
deduplicated_key = [h,5,e,6,u,z]
我可以使用deduplicated
获取list(set(original))
_原文但是我无法获得相应的deduplicated_key
答案 0 :(得分:6)
您可以使用set来跟踪重复项,并使用enumerate()
来迭代原始列表的索引/值:
has_attachment :photo_cache
答案 1 :(得分:1)
可能不太优雅,不太容易遵循列表显示,索引切片
内部列表comp向后遍历输入列表org
,询问是否存在先前的匹配元素,如果是,则记录此重复的索引
[len(org) - 1 - i
for i, e in enumerate(org[::-1]) if e in org[:-i-1]]
然后外部列表comp使用.pop()
来修改org,ky作为副作用
嵌套列表理解' dups'一个'一个班轮' (带换行符):
org = ['a','a','a',3,4,5,'b',2,'b']
ky = ['h','f','g',5,'e',6,'u','z','t']
dups = [(org.pop(di), ky.pop(di))
for di in [len(org) - 1 - i
for i, e in enumerate(org[::-1]) if e in org[:-i-1]]]
org, ky, dups
Out[208]:
(['a', 3, 4, 5, 'b', 2],
['h', 5, 'e', 6, 'u', 'z'],
[('b', 't'), ('a', 'g'), ('a', 'f')])
当然,你实际上不必将列表补偿结果分配给任何东西以获得修改列表的副作用
答案 2 :(得分:0)
您可以手动获取所有重复索引,如下所示:
indices = []
existing = set()
for i, item in enumerate(original):
if item in existing:
indices.append(i)
else:
existing.add(item)
然后从key
列表中删除这些索引,反过来因为删除键会更改其他项的索引:
for i in reversed(indices):
del key[i]