2013-01-13 3 views
2

필자는 반복 할 필요가있는 파이썬 세트를 가지고 있으며 각 요소에 대해 제약 조건을 만족하는지 확인하고, 그렇다면이를 제거하고 다른 비어있는 비어있는 세트에 추가하십시오. 버퍼에 추가 한 다음 루프가 완료된 후 버퍼를 반복하고 해당 내용을 집합에서 제거 할 수 있지만이를 수행하는 더 좋은 방법이 있어야합니다. 여기 java의 iterator.remove()는 어떻게 python으로 변환됩니까?

내가 할 노력하고있어 무엇 :이 작동하지 않습니다

for elem in S: 
    if (P(elem)): 
    S.remove(elem) 
    T.add(elem) 

. 여기

작동하지만 부정한 것 수정입니다 :

B = set() 
for elem in S: 
    if (P(elem)): 
    B.add(elem) 
    T.add(elem) 
for elem in B: 
    S.remove(elem) 

편집 : 가장 좋은 해결책이 보인다 가 될 : 목록은

for elem in S.copy(): 
    if (P(elem)): 
    S.remove(elem) 
    T.add(elem) 
+0

, 나는 당신이 다루고있는 추측 될 문제가되지 않습니다 * list *는 단지 반복 가능한 것이 아니라 일반적으로 직접적으로 주소 지정 가능하거나 변경할 수있는 것이 아닙니다. –

+0

이 기능을 "파티션"이라고합니다. 그러나, 작성하기가 상당히 쉽지만 그러한 표준 파이썬 구조는 없습니다. http://stackoverflow.com/questions/4578590/python-equivalent-of-filter-getting-two-output-lists-ie-partition-of-a-list를 참조하십시오 (일부는 지연 반복자를 허용하고 다른 일부는 평가를 강제합니다) –

답변

2

, 반복하기 전에 복사본을 생성 :

for elem in S[:]: 

여기서 [:] 슬라이스 표기법은 전체 목록의 py. 목록을 반복하는 동안 목록에서 요소를 제거 할 수 없습니다.

1

목록 작성을 사용하여 T을 만든 다음 T의 모든 요소를 ​​S에서 제거하는 것이 좋습니다.

T = set([elem for elem in S if P(elem)]) 
S = S - T 
+0

이것은 T가 비어있는 경우에만 작동합니다. 내 문제가 내게 중요하지 않은 것은 T가 비어 있지 않을 수도 있다는 것입니다. – user1123936

+1

@ user1123936 : 한 가지 옵션은 임시 세트'X'를 사용하고 답안의 코드 뒤에'X'를'T'에 추가하는 것입니다. – Tim

0

반복하는 경우, 두 번 목록을 통해 각 항목에 대해 두 번 P()를 호출이 가장 읽을 수있는 솔루션 ::

상황에서
T = [x for x in S if P(elem)] 
S = [x for x in S if not P(elem)] 
관련 문제