2009-06-10 16 views
3

私はアイテム(HTMLテーブルの行であり、美味しいスープで抽出されたもの)のリストを持っています。リストを反復して偶数と奇数の要素各ループが実行されます。このコードはあまり醜い作り方は偶数と奇数のリストを同時に繰り返します

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

: 私のコードは次のようになりますか?または、これを行うには良い方法でしょうか?

EDIT:

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

これはクラスにありますが、このループは1か所でのみ実行されるので、これからメソッドを作成する必要があると思います。とにかくありがとう – 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

ありがとう - どちらのレシピも良さそうです。とにかく、これを行う他の方法は興味があったので(そしてもっとPythonを学ぶために - そして私は:)) – uolot

関連する問題