範囲関数は連結を許可しますか?ように私はrange(30)
& range(2000, 5002)
とそれを連結したいと思う。これは私の最新のpython(版:3.3.0)上で動作しないようなので、私の連結範囲は0, 1, 2, ... 29, 2000, 2001, ... 5001
2つの範囲関数結果を連結する
コードになります
range(30) + range(2000, 5002)
範囲関数は連結を許可しますか?ように私はrange(30)
& range(2000, 5002)
とそれを連結したいと思う。これは私の最新のpython(版:3.3.0)上で動作しないようなので、私の連結範囲は0, 1, 2, ... 29, 2000, 2001, ... 5001
2つの範囲関数結果を連結する
コードになります
range(30) + range(2000, 5002)
あなたはこのためにitertools.chain
を使用することができます。
from itertools import chain
concatenated = chain(range(30), range(2000, 5002))
for i in concatenated:
...
それは、任意のiterablesで動作します。 Python 2と3の間では、range()
の動作に違いがあることに注意してください。Python 2ではrange
がリストを返し、Python3ではメモリ効率が良いが必ずしも望ましいとは言えないイテレータが返されます。
リストは+
と連結できますが、イテレータは連結できません。 Pythonの2.xで
range()
は、リストを返します:Pythonの2.xで
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
xrange()
は、イテレータを返します。
>>> xrange(10)
xrange(10)
とPython 3 range()
でも、イテレータを返します。
>>> r = range(10)
>>> iterator = r.__iter__()
>>> iterator.__next__()
0
>>> iterator.__next__()
1
>>> iterator.__next__()
2
ほかの人が指摘しているように、chain()
を使ってイテレータを連結してください。
あなたの答えは役に立ちますが、解決策はありません。 –
list-comprehensionを使用して行うことができます。
>>> [i for j in (range(10), range(15, 20)) for i in j]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 15, 16, 17, 18, 19]
お客様のご要望にお応えしますが、長い回答ですので、ここに掲載しません。
注:
for x in (i for j in (range(30), range(2000, 5002)) for i in j):
# code
、あるいは発電機の変数へ:パフォーマンス向上のための発電機とすることができます。
gen = (i for j in (range(30), range(2000, 5002)) for i in j)
for x in gen:
# code
+1追加の依存関係はありません – mkind
@mkindありがとう、私は依存関係が嫌い、人々は常に輸入とライブラリのトンでジャンプして答えますが、いつも利用できるわけではなく、通常のコードと同じことをしばしばラップしますパッケージでは、その魔法ではありません。 :) –
私は標準ライブラリを使用していないと思っていません_それは自分自身の美徳ですが、これは良い答えです。 –
私は可能な最も簡単な解決策(効率を含む)が好きです。解決策がそのようなものかどうかは必ずしも明らかではありません。とにかく、Python 3のrange()
はジェネレータです。反復を行うどのコンストラクトにもラップすることができます。 list()
は、任意のイテラブルからリスト値を構築することができます。リストの+
演算子は連結を行います。私は、例の小さな値を使用しています:
>>> list(range(5))
[0, 1, 2, 3, 4]
>>> list(range(10, 20))
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> list(range(5)) + list(range(10,20))
[0, 1, 2, 3, 4, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
これはrange(5) + range(10, 20)
は正確にはPython 2.5で何をしたかである - range()
リストを返したため。
Python 3では、実際にリストを構築したい場合にのみ便利です。それ以外の場合は、itertools.chainのLev Levitsky'sソリューションをお勧めします。文書はまた、非常に簡単な実装を示しています
def chain(*iterables):
# chain('ABC', 'DEF') --> A B C D E F
for it in iterables:
for element in it:
yield element
Inbar Roseによって溶液が細かいと機能的に同等です。とにかく、私の+1はLev Levitskyと、標準ライブラリの使用に関する彼の議論に行きます。 からPythonのの禅...曖昧さの顔で
は、推測する誘惑を拒否します。私の意見で
#!python3
import timeit
number = 10000
t = timeit.timeit('''\
for i in itertools.chain(range(30), range(2000, 5002)):
pass
''',
'import itertools', number=number)
print('itertools:', t/number * 1000000, 'microsec/one execution')
t = timeit.timeit('''\
for x in (i for j in (range(30), range(2000, 5002)) for i in j):
pass
''', number=number)
print('generator expression:', t/number * 1000000, 'microsec/one execution')
、itertools.chain
は、より読みやすいです。しかし、本当に重要なのは...
itertools: 264.4522138986938 microsec/one execution
generator expression: 785.3081048010291 microsec/one execution
...約3倍速いです。
これは素晴らしいです、私は効率的に構築された標準ライブラリモジュールによって敗北を認めます。あなたのタイミングが奇妙な、私のマシン上で数多くのテストの後、私は私のソリューションは約3倍遅く、約1.8倍の速度が遅いことがわかりました。それでもまだ遅いです。 –
これは間違いなくハードウェアに依存し、OSにも依存する可能性があります。私は、AMD Athlon 64 X2デュアルコアプロセッサ3800+を2.01 GHzで使用し、3 GBのメモリを使用しました。 OSはWindows 7 Home Premium 64ビットです(プロセッサとメモリの両方のスコアは4,9です - http://windows.microsoft.com/en-US/windows7/What-is-the-Windows-Experience-Index) 。私はPythonの実装についてはわかりません。プロセッサーのコアが増えているかもしれません。 – pepr
extendメソッドの助けを借りて、2つのリストを連結することができます。
>>> a = list(range(1,10))
>>> a.extend(range(100,105))
>>> a
[1, 2, 3, 4, 5, 6, 7, 8, 9, 100, 101, 102, 103, 104]
これはPython 2のためのもので、OPはPython 3を使用しています。 –
Extendはキーワードではなく、Pythonリストのメソッドです。 – user7610
私が重複する場合があり、最終的なイテレータで繰り返される値をしたくなかった範囲の未知の数を、連結しようとしていたので、私はこの質問に来ました。
range1 = range(1,4)
range2 = range(2,6)
concatenated = set.union(set(range1), set(range2)
for i in concatenated:
print(i)
Pythonのバージョン:私のソリューションは
set
などのようなunion
演算子を使用していましたか? –私のpythonのバージョンはバージョン3.3.0です。私はまた私の質問で更新しました – MAG
結果として(どのようなデータの種類 - プレーンリスト、ジェネレータ、何か他のもの)取得したいのですか?あなたは結果に何をしたいですか? –