我有一个奇怪的情况导致我混淆(和错误。)我已经重命名变量更清楚,但问题是真的。我有两个需要组合的迭代。组合应该是一个没有重复的结合。但是,如果一个元素与另一个元素“相反”,则最终集合中不应该存在元素。
概念示例:(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)
是否有任何想法如何使这个更干净(并且工作而不修改我正在迭代的集合)?我觉得这个问题的一个很好的解决方案不仅仅是复制集合......
答案 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]
。