Python - 检查元组列表中项目的组合

时间:2014-01-09 16:01:57

标签: python list tuples

我有两个元组列表:第一个(A)有值集I' m。第二个(B)具有我想要清除的值的组合,如果它们存在于A中。

A = [(1, 2, 3), (6, 10, 8)]
B = [(5, 7, 9), (10, 6)]

正如您所看到的,检查因以下事实而变得复杂: - B元组可能比A元组短 - B元组的长度可能不同 - 这些值在B元组中的显示顺序可能与在A元组中的顺序不同 - A元组都具有相同的长度,但该长度不能预先确定

我提出这样做​​的最佳方式涉及一些冗余:

bad_tuples = [tup for badtup in B for tup in A 
              if [baditem for baditem in badtup if baditem in tup]
              and len([baditem for baditem in badtup if baditem in tup]) == len(badtup)]
good_tuples = [tup for tup in A if tup not in bad_tuples]

我认为这可以完成工作,但我不喜欢在找到bad_tuples时必须复制相同的列表理解这一事实。我也发现它很难读,所以容易出错。那么,任何人都可以想到一种更优雅/更有效的方式来完成任务吗?

(如果重要的话,在我的应用程序中,A中可能有很多(但<100)元组,B中只有少数(<10)元组。)

2 个答案:

答案 0 :(得分:4)

如果元组中的条目确实是唯一的,那么它应该如下所示:

[x for x in A if set(x) not in [set(y) for y in B]]

<强>更新

根据评论,似乎排除应该是A中的所有元组,其中B中的元组是所有转换为集合时的子集。所以它是:

[x for x in A if not any([set(y).issubset(set(x)) for y in B])]

答案 1 :(得分:0)

这应该有用。

for tup in B:
    if(tup in A):
        bad_tuples.append(tup)
    else:
        good_tuples.append(tup)

假设,元组元素的顺序是相关的。