简体   繁体   中英

Python removing duplicates in a list

I want to remove duplicated in a python list in a way that allows me to alter another corresponding list in the same way. In the below example original is the list I want to de-duplicate. Each element in key that shares the same index as original corresponds to each other:

original = [a,a,a,3,4,5,b,2,b]
key      = [h,f,g,5,e,6,u,z,t]

So I want to remove duplicates in original such that whatever element I delete from original I delete the corresponding element (of the same index) in key . Results I want:

deduplicated_original = [a,3,4,5,b,2]
deduplicated_key      = [h,5,e,6,u,z]

I can get deduplicated _original using list(set(original)) however I cannot get the corresponding deduplicated_key

You can use a set to keep track of duplicates and enumerate() to iterate over indexes/values of the original list:

seen = set()
lst = []

for i, v in enumerate(original):
    if not v in seen:
        lst.append(key[i])
        seen.add(v)
print(lst)

maybe less elegant, less easy to follow the list revesal, index slicing

the inner list comp walks the input list org backwards, asking if there is a prior matching element, if so record the index of this duplicate

[len(org) - 1 - i
 for i, e in enumerate(org[::-1]) if e in org[:-i-1]]

then the outer list comp uses .pop() to modify org, ky as a side effect

nested list comprehension 'dups', a 'one liner' (with line breaks):

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')])  

of course you don't actually have to assign the list comp result to anything to get the side effect of modifying the lists

You can manually get all the indices of duplicates like this:

indices = []
existing = set()
for i, item in enumerate(original):
    if item in existing:
        indices.append(i)
    else:
        existing.add(item)

and then remove those indices from your key list, in reverse because deleting a key changes the indices of further items:

for i in reversed(indices):
    del key[i]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM