2009-06-10 6 views
3

나는 목록 (HTML 표 행, Beautiful Soup로 추출 됨) 목록을 가지고 있으며 목록을 반복하고 짝수와 홀수 요소 (색인을 의미 함)를 가져와야합니다. 각 루프가 실행됩니다. 내 코드는 다음과 같습니다은 짝수 및 홀수 목록의 목록을 동시에 반복합니다.

for top, bottom in izip(table[::2], table[1::2]): 
    #do something with top 
    #do something else with bottom 

방법이 코드가 덜 추한하기 위해? 아니면 이것을하는 것이 좋은 방법일까요?

는 편집 :

table[1::2], table[::2] => table[::2], table[1::2] 

답변

4

시도 :이 솔루션은, 어떤 순서에서 작동 단지 나열하지, 및 순서를 복사하지 않습니다

def alternate(i): 
    i = iter(i) 
    while True: 
     yield(i.next(), i.next()) 

>>> list(alternate(range(10))) 
[(0, 1), (2, 3), (4, 5), (6, 7), (8, 9)] 

가 (이 경우 훨씬 더 효율적입니다 긴 시퀀스의 처음 몇 요소 만 원한다면).

+0

O는 정말이 솔루션을 좋아한다. – uolot

+0

아하, 왜 코멘트를 편집 할 수 없습니까? "나는 정말로 ..."해야합니다. – uolot

0

좋아 보인다. 내 유일한 제안은이 함수 또는 메서드에서 래핑하는 것입니다. 그렇게하면 이름을 더 쉽게 읽을 수있게 할 수 있습니다 (evenOddIter()).

+0

이 문맥에서 기능과 방법의 차이점은 무엇입니까? –

+0

위 코드가 클래스 또는 최상위 레벨인지 여부에 따라 달라집니다. 재사용이 많은 클래스에 있다면 메서드를 사용하는 것이 좋습니다. 함수를 사용할 때 클래스 외부에서 재사용하는 것이 더 간단하지만 전역 네임 스페이스가 복잡해집니다. –

+0

이 클래스는 클래스에 있지만이 루프는 한 곳에서만 실행되므로이 ​​방법을 사용해야 할 필요가 있다고 생각합니다. 어쨌든 고마워요 – uolot

5

izip은 꽤 좋은 옵션이지만, 여기 당신이 그것으로 불행에 있기 때문에 몇 가지 대안을 : 당신이 볼 수 있듯이

>>> def chunker(seq, size): 
...  return (tuple(seq[pos:pos+size]) for pos in xrange(0, len(seq), size)) 
... 
>>> x = range(11) 
>>> x 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
>>> chunker(x, 2) 
<generator object <genexpr> at 0x00B44328> 
>>> list(chunker(x, 2)) 
[(0, 1), (2, 3), (4, 5), (6, 7), (8, 9), (10,)] 
>>> list(izip(x[1::2], x[::2])) 
[(1, 0), (3, 2), (5, 4), (7, 6), (9, 8)] 

가이 제대로 요소의 고르지 못한 양을 처리 할 수있는 장점이있는 당신에게 중요 할 수도 있고 중요하지 않을 수도 있습니다. itertools documentation itself에서이 조리법도 있습니다 :

>>> def grouper(n, iterable, fillvalue=None): 
...  "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx" 
...  args = [iter(iterable)] * n 
...  return izip_longest(fillvalue=fillvalue, *args) 
... 
>>> 
>>> from itertools import izip_longest 
>>> list(grouper(2, x)) 
[(0, 1), (2, 3), (4, 5), (6, 7), (8, 9), (10, None)] 
+0

고마워 - 두 요리법 모두 좋아 보인다. 어쨌든 나는이 일을하는 다른 방법이 무엇인지에 관심이 있었기 때문에 물었다. (그리고 더 많은 파이썬을 배울 것이고 나는했다.) – uolot

관련 문제