2014-11-25 3 views
1

혼란 (그리고 오류)을 일으키는 이상한 상황이 있습니다. 변수를보다 명확하게 바꾸었지만 문제는 사실입니다. 내가 결합해야하는 두 개의 반복문이 있습니다. 조합은 반복없이 연결이어야합니다. 그러나 요소가 다른 요소의 "반대"이면 요소가 최종 집합에 존재하지 않아야합니다.두 조건의 조건부 합동

개념적 실시 예 (A, B가 C) 겸용 (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

원자가 'a'라고 가정 해 보겠습니다. 'atom_set'에서 a.opposite()와 같은 것을 할 수 있습니까? 아마도 더 빠르고 쉽게 읽을 수 있습니다. – Kevin

+0

작동하려면 어떤 마법 기능을 지원해야합니까? – BlackVegetable

+0

@Kevin 즉, '반대'기능을 쓸 수 있습니다. '__eq__'는 제가 걱정해야 할 모든 것입니까? – BlackVegetable

답변

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에는없는 원자를 처리합니다.

+0

원자가 너무 많습니까? 만약 두 개의 원자가 비교되지 않고 그 반대가 반대 인 경우가 세트 안에 있다면 그것은 원자를 더할 것입니다. – BlackVegetable

+0

@BlackVegetable, 맞습니다 - 가능하지 않을 수도있는 수정으로 내 대답을 업데이트했습니다. 메소드'opposite()'의 존재 여부에 달려 있습니다. 이것은 또한 다른 대답에 대한 요구 사항입니다. – vikramls

+0

예, 이것은 쓸 수있는 기능입니다. 필자는 아마도이 목록이 이해력보다 읽기 쉽다고 생각합니다. 고맙습니다. – BlackVegetable

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]을 제공합니다.

+0

나는 이것을 따른다 고 생각한다. 미래의 독자들에게 왜 이것이 효과가 있는지 명확히 할 수 있습니까? (+1, 다른 더 읽기 쉬운 답변이 제안되지 않으면 받아 들일 것입니다.) – BlackVegetable

+0

요소의 반대쪽이 같은 세트에 존재한다면이 요소를 추가하지 않아도됩니다. 그게 문제인지 아닌지는 모르겠습니다 만 – GP89

+1

@ GP89 저와이 저자 사이의 의견 교환에서 언급했듯이, 그것은 내 상황에서는 결코 그렇지 않을 것입니다. – BlackVegetable