我有三个列表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只删除其中一个重复项并将另一个留在新列表中。我希望能够删除它们。
感谢任何帮助!
答案 0 :(得分:5)
使用collections.Counter
和zip
,您可以统计独特的三元组。
然后通过生成器理解删除重复项。
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]