我有两个元组列表:第一个(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)元组。)
答案 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)
假设,元组元素的顺序是相关的。