Python删除列表

时间:2017-09-22 13:59:23

标签: python list

我希望以一种允许我以相同方式更改另一个相应列表的方式删除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

3 个答案:

答案 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]