删除多个列表python中的两个重复项

时间:2018-06-13 14:25:30

标签: python python-3.x list

我有三个列表X,Y,Z如下:

X: [1, 1, 2, 3, 4, 5, 5, 5]
Y: [3, 3, 2, 6, 7, 1, 1, 2]
Z: [0, 0, 1, 1, 2, 3, 3, 4]

我试图在列表的相同索引处删除两个重复的值集,得到一个简化列表,如下所示,所有三个列表在最初和结束时始终具有相同的长度:

X: [2, 3, 4, 5]
Y: [2, 6, 7, 2]
Z: [1, 1, 2, 4]

我尝试使用zip(X,Y,Z)函数,但我无法对其进行索引,而dict.fromkeys只删除其中一个重复项并将另一个留在新列表中。我希望能够删除它们。

感谢任何帮助!

4 个答案:

答案 0 :(得分:5)

使用collections.Counterzip,您可以统计独特的三元组。

然后通过生成器理解删除重复项。

from collections import Counter

X = [1, 1, 2, 3, 4, 5, 5, 5]
Y = [3, 3, 2, 6, 7, 1, 1, 2]
Z = [0, 0, 1, 1, 2, 3, 3, 4]

c = Counter(zip(X, Y, Z))

X, Y, Z = zip(*(k for k, v in c.items() if v == 1))

print(X, Y, Z, sep='\n')

(2, 3, 4, 5)
(2, 6, 7, 2)
(1, 1, 2, 4)

请注意,如果要求订购并且您没有使用Python 3.6+,则可以通过继承collections.OrderedDict来创建“OrderedCounter”。

答案 1 :(得分:1)

使用pandas library进行任务非常方便。只需使用列表创建数据框,并将df.drop_duplicates应用于keep=False(意味着删除所有重复的行):

import pandas as pd

dct = {
"X": [1, 1, 2, 3, 4, 5, 5, 5],
"Y": [3, 3, 2, 6, 7, 1, 1, 2],
"Z": [0, 0, 1, 1, 2, 3, 3, 4],
}
d = pd.DataFrame(dct)
d.drop_duplicates(keep=False)

答案 2 :(得分:0)

不是最好的方法

>>> from collections import Counter
>>> zipped_items = list(zip(x,y,z))
>>> counts = Counter(zipped_items)
>>> filtered_items = [item for item in zipped_items if counts[item] == 1]
>>> x1, y1, z1 = [ list(map(lambda x: x[i], filtered_items))
... for i in range(3)]

答案 3 :(得分:0)

这是我的解决方案没有任何导入,但仍然简短易读:

X = [1, 1, 2, 3, 4, 5, 5, 5]
Y = [3, 3, 2, 6, 7, 1, 1, 2]
Z = [0, 0, 1, 1, 2, 3, 3, 4]

zipped = list(zip(X, Y, Z))
X, Y, Z = zip(*[i for i in zipped if zipped.count(i) == 1])
X, Y, Z = list(X), list(Y), list(Z)    

print(X, Y, Z, sep='\n')
# [2, 3, 4, 5]
# [2, 6, 7, 2]
# [1, 1, 2, 4]