如果6个标准中的4个相等,Python将删除重复项

时间:2017-07-20 11:48:38

标签: python

我是python的新手(使用3.6)并且可以使用一些帮助,我们将非常感激!我一直在尝试使用set()修复我的问题,但我无法正确解决问题。如果4个第一个元素相等,我试图在长Tuples中过滤重复的list。这个列表有600多个像这样的元组。

实施例。 - [(1, 1 , 1, '0x19', '0x19', 'age')] and [(1, 1, 1, '0x19', '-', '-')]在前4个元素中相等,因此我想从列表中删除[(1, 1, 1, '0x19', '-', '-')]并将tuple与'age'保持一致。与[(1, 2, 1, '0x19', '0x11', 'odd')] and [(1, 2, 1, '0x19', '-', '-')]相同,4个第一个元素相同,所以我想从列表中删除[(1, 2, 1, '0x19', '-', '-')]并保持“奇数”,但如果tuple没有重复我仍然希望它留在list。 Ex [(1, 1, 3, '0x2F', '-', '-')][(1, 2, 0, '0x1637', '-', '-')]没有重复,所以我仍然需要它们留在新列表中。

前列表:

[(1, 1, 0, '0x1636', '-', '-')]
[(1, 1, 1, '0x19', '0x19', 'age')]
[(1, 1, 1, '0x19', '-', '-')]
[(1, 1, 2, '0x02', '0x02', 'live')]
[(1, 1, 2, '0x02', '-', '-')]
[(1, 1, 3, '0x2F', '-', '-')]
[(1, 2, 0, '0x1637', '-', '-')]
[(1, 2, 1, '0x19', '0x11', 'odd')]
[(1, 2, 1, '0x13', '-', '-')]
[(1, 2, 1, '0x11', '-', '-')]
[(1, 2, 1, '0x05', '-', '-')]
[(1, 2, 2, '0x02', '0x04', 'tree')]
[(1, 2, 2, '0x02', '-', '-')] 
[(.....................)]

' - '是我现在的暂时值(我还没有分配任何东西)。

我没有要显示的测试代码,因为我没有真正领导如何做到这一点,但我想set()和for循环/嵌套循环可以用来解决这个问题,但我不知道怎么做。 ..所以我要求一些帮助。

由于

1 个答案:

答案 0 :(得分:6)

要做到这一点,我会:

  • 使用4个第一个值的元组作为键创建字典,因此最后插入删除第一个插入的
  • 确保"虚线"值首先出现(如果某个其他具有相同键的值到达dict中,则会被覆盖),按照" 2的最后一个值进行排序"标准
  • 只取字典的值(不再使用键)并转换回列表(在python 3中有用)
像这样:

l = [(1, 1, 0, '0x1636', '-', '-'),
(1, 1, 1, '0x19', '0x19', 'age'),
(1, 1, 1, '0x19', '-', '-'),
(1, 1, 2, '0x02', '0x02', 'live'),
(1, 1, 2, '0x02', '-', '-'),
(1, 1, 3, '0x2F', '-', '-'),
(1, 2, 0, '0x1637', '-', '-'),
(1, 2, 1, '0x19', '0x11', 'odd'),
(1, 2, 1, '0x13', '-', '-'),
(1, 2, 1, '0x11', '-', '-'),
(1, 2, 1, '0x05', '-', '-'),
(1, 2, 2, '0x02', '0x04', 'tree'),
(1, 2, 2, '0x02', '-', '-')]

newl = list({tuple(v[:4]):v for v in sorted(l,reverse=True,key = lambda v : all(x == '-' for x in v[4:]))}.values())

print(newl)

结果:

[(1, 1, 0, '0x1636', '-', '-'), (1, 1, 3, '0x2F', '-', '-'), (1, 2, 1, '0x19', '0x11', 'odd'), (1, 2, 2, '0x02', '0x04', 'tree'), (1, 2, 1, '0x13', '-', '-'), (1, 2, 1, '0x11', '-', '-'), (1, 1, 1, '0x19', '0x19', 'age'), (1, 2, 0, '0x1637', '-', '-'), (1, 2, 1, '0x05', '-', '-'), (1, 1, 2, '0x02', '0x02', 'live')]

请注意,如果您希望对列表进行排序,只需将newl = list(替换为newl = sorted(即可获得:

 [(1, 1, 0, '0x1636', '-', '-'), (1, 1, 1, '0x19', '0x19', 'age'), (1, 1, 2, '0x02', '0x02', 'live'), (1, 1, 3, '0x2F', '-', '-'), (1, 2, 0, '0x1637', '-', '-'), (1, 2, 1, '0x05', '-', '-'), (1, 2, 1, '0x11', '-', '-'), (1, 2, 1, '0x13', '-', '-'), (1, 2, 1, '0x19', '0x11', 'odd'), (1, 2, 2, '0x02', '0x04', 'tree')]

(第二种看起来很丑陋,我知道,但按值排序&#34;先破坏&#34;并不容易,特别是当列表被字典过滤时)< / p>