两个Iterables的条件连接

时间:2014-11-25 16:52:45

标签: python set iterable

我有一个奇怪的情况导致我混淆(和错误。)我已经重命名变量更清楚,但问题是真的。我有两个需要组合的迭代。组合应该是一个没有重复的结合。但是,如果一个元素与另一个元素“相反”,则最终集合中不应该存在元素。

概念示例:(a,b,c)COMBINE(b,c',d) - > (a,b,d)#设c与c'

相反

这是我当前的实现失败,部分是因为我试图在迭代它时修改集的大小:

# atom_list and atom_set are distinct not only in their type but also their contents.
for atom in atom_list:
    should_add = True
    for other_atom in atom_set:
        if atom.is_opposite(other_atom):
            # Todo: cause anti-matter/matter explosion!!
            atom_set.remove(other_atom)
            should_add = False
    if should_add:
        atom_set.add(atom)

是否有任何想法如何使这个更干净(并且工作而不修改我正在迭代的集合)?我觉得这个问题的一个很好的解决方案不仅仅是复制集合......

2 个答案:

答案 0 :(得分:3)

正如你所说的,在迭代迭代时修改iterable并不是一个好主意。为什么不创建另一套?

combined_set = set()
for atom in atom_list:
    if atom.opposite() not in atom_set:
        combined_set.add(atom)

atom_list_set = set(atom_list)
for atom in atom_set:
    if atom not in atom_list_set:
        combined_set.add(atom)

这假设存在一个返回原子相反的opposite()方法。第二个for循环处理atom_set中但不在atom_list中的原子。

答案 1 :(得分:0)

快速'脏'解决方案:

s1 = set([1, 2, 3])
s2 = set([4, -2, 5])
res = [x for x in s1 | s2 if -x not in s1 and -x not in s2]

2和-2是我们排除的相反元素。它给出了[1, 3, 4, 5]