2016-09-01 7 views
2

Pythonでは、反復処理時にrangeの代わりにxrange()を使用する方がメモリー効率が向上します。任意の要素をxrange()に追加しますか?

私が抱えている問題は、大きいリストを繰り返し処理したいということです。xrange()を使用する必要があり、その後、任意の要素をチェックしたいと思います。

range()とすれば、簡単です:x = range(...) + [arbitrary element]

しかしxrange()で、これよりもクリーンソリューションがあるように思えません:クリーナーソリューションの

for i in xrange(...): 
    if foo(i): 
     ... 
if foo(arbitrary element): 
     ... 

任意の提案ですか?任意の要素をジェネレータに「追加」する方法はありますか?

+1

あなたはどのような繰り返しをしているのかを明確にすることはできますか? 'xrange(len(my_list)) 'を使用してリスト自体を繰り返し処理する場合は、' xrange'を使用しないでください。 'for i、elem in enumerate(my_list)'を使ってこれを行うことができます。 iの値。 –

+0

@ Two-BitAlchemist私は確か 'len(my_list) 'を反復していません。私はあなたがそれをなぜ仮定するのか分かりません。一般性を失うことなく、 'range()'の代わりに 'xrange()'を使用するのに十分な範囲で繰り返し実行しているとしましょう。 'xrange(99999999)' – Newb

+1

"私はあなたがそれを仮定する理由を知らない。" 'range(len(x))'はPythonの非常に一般的な反復パターンで、StackOverflowの質問には何百回も出現します。ちょうど明確にしたいと思った。 –

答えて

9

itertools.chainを使用すると、複数のイテラブルから複合イテレータを行うことができますそれらを連結することなく(したがって、高価な一時変数はありません):

from itertools import chain 

# Must wrap arbitrary element in one-element tuple (or list) 
for i in chain(xrange(...), (arbitrary_element,)): 
    if foo(i): 
     ... 
+0

これは知っていると素晴らしいです。 itertoolsが再び襲います! – bravosierra99

7

私は蚊帳の外arbitrary_elementチェックを保つお勧めだろうが、あなたはそれループの一部にしたい場合は、itertools.chainを使用することができます。

for i in itertools.chain(xrange(...), [arbitrary_element]): 
    ... 
+0

くそー私は遅かった:Dこれは本当の答えです。 – Rockybilly

+1

私は推奨事項に同意しません。ループの内容を複製することは、範囲を連鎖させることより確実に悪いことです。 – Hurkyl

+0

@Hurkyl:ループ本体を機能させる場合、ループ本体を複製する必要はありません。 – user2357112

関連する問題