【问题标题】:How do I loop through two lists of lists and avoid duplicate combinations for values at specific positions?如何遍历两个列表列表并避免特定位置的值重复组合?
【发布时间】:2012-09-25 01:28:50
【问题描述】:

我想遍历两个列表列表,并避免在每个列表的位置 1 和 2 之间重复组合值。

a = [[2007, 206, 205, 8], [2007, 206, 208, 9]]
b = [[2007, 205, 206, 8], [2007, 207, 210, 10]]

在这种情况下,对于 a[0],位置 1 和 2 将分别为 206 和 205,而对于 b[0],位置 1 和 2 将分别为 205 和 206。a[0] 和 b[0] 导出来自相同的数据集,但结构不同。但是,根据组合, b[0] 将是 a[0] 的副本。如何避免这种基于组合的重复?

谢谢。

【问题讨论】:

  • Python 有一个set 数据结构,您可能会发现它很有用。
  • b[0] 是“重复的”,你想怎么办?
  • 你想做什么来“避免”重复?创建一个包含来自 a 和 b 的所有非重复记录的新列表 c?从 a 或 b 中删除记录?对 a 和 b 中的所有列表进行重复数据删除,还是仅在相应位置之间进行重复?
  • 我想删除列表组合列表中的 b[0] 和任何其他重复项并附加到最​​终列表。

标签: python list loops duplicates combinations


【解决方案1】:

如果你想要这样的结果:

c = [[2007, 206, 205, 8], [2007, 206, 208, 9], [2007, 207, 210, 10]]

这应该很容易:

a = [[2007, 206, 205, 8], [2007, 206, 208, 9]]
b = [[2007, 205, 206, 8], [2007, 207, 210, 10]]
from itertools import chain
seen = set()
c = []
for lst in chain(a,b):
    one_two = tuple(lst[:1] + sorted(lst[1:-1]) + lst[-1:])
    if one_two not in seen:
       seen.add(one_two)
       c.append(lst)

【讨论】:

  • 在我评论问题之前,您一直在解决问题。 :^) 但我认为您需要在键中使用所有四个值;否则你无法区分开头和结尾不同但中间数字相同的 4 元组。
  • @DSM -- 是的,我知道。据我了解,这是期望的行为(否则,中间两者的特殊意义是什么?)。您是否提出类似:tuple([lst[0]]+sorted(lst[1:3])+lst[3])
  • 嗯。我认为这只是中间两个不是规范的顺序。现在,如果你看到 [2012, 205, 206, 8] 然后是 [2007, 205, 206, 9],后者将被抑制。编辑:是的,这正是我的想法。
  • @DSM -- 为什么?我认为这不会抑制后者(我最近的编辑),因为lst[3] 保留在“密钥”中。
  • 当我发表评论时,在“编辑:”之前没有lst[3]。 :^) +1 现在,我认为这消除了 OP 给出的意义上的“重复”。
【解决方案2】:
sorted_a = [sorted(x) for x in a]
filtered_b = filter(lambda x: sorted(x) not in sorted_a, b)

【讨论】:

  • 排序后基本相同的组合将是相同的。您可以使用整个子列表或其中的一部分来做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-30
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多