2011-03-04 6 views
0

こんにちは私はこのような状況があります。Pythonのリストの混乱

>>> def get(): 
...  for i in range(3): 
...    yield [0] 
... 

を、私はこの取得したい:[0,0,0]

私のコードは、今、このように動作します:

>>> r = [] 
>>> r.extend(i[0] for i in get()) 
>>> r 
[0, 0, 0] 

しかし、私は[0] .. いくつかのアドバイスをしたくないですか?

(私はのpython3によ)

答えて

1

r.extend

このような命令コード(ステートフルで、インプレイスアップデートあり)は問題を求めています。= `取得ラムダ:

from itertools import chain 

def flatten(listOfLists): 
    return chain.from_iterable(listOfLists) 

def get(): 
    for i in range(3): 
     yield [0] 

print(list(flatten(get()))) 
# [0, 0, 0] 
1

私にとって、これはgetのように見えるだけで、これまでそのような場合、長さ1のリストを返すかっこをドロップすることができます。

>>> def get(): 
...  for i in range(3): 
...    yield 0 
>>> # Or, shorter ... 
>>> get = lambda: (0 for i in range(3)) 
>>> r = [] 
>>> r.extend(get()) 
>>> r 
[0, 0, 0] 
+0

またはさらに短い:それは、機能flattenconcat)のための標準的な使用を思わ[0] * 3'。 –

+0

@ Space_C0wb0yいいえ、コードが短くはありませんが、ジェネレータではなくリストが作成されます。 3の大きな値の場合、ソリューションは不必要なメモリを大量に割り当てます。 – phihag

+0

@philhag私は "3の大きな値"という考え方が好きです:これは数学を面白くすることができます:-) – neil

2

あなたのコード非常に奇妙に見えますが、私はそれが非常に単純化されていると思います。それだけでi[0]を取り除くことだ場合は、次の操作を行います。

>>> def get(): 
...  for i in range(3): 
...    yield 0 
... 
>>> r = [] 
>>> r.extend(get()) 
>>> r 
[0, 0, 0] 
+2

なぜ[私はget()] 'の意味ですか?これは不必要にリストを割り当て、 'i in i 'は同音異義語です。 – phihag

+0

phihag:本当に、ヒントのおかげで、更新されました:) –

0

を配列を得ないで、あなたが1たくない場合:あなたは代わりにこれを試みることができる

>>> def get(): 
... for i in range(3): 
... yield 0 
... 
>>> r = [] 
>>> r.extend(i for i in get()) 
>>> r 
[0, 0, 0] 
+1

'r.extend(get())'で十分です。 –

+0

確かに、かなり正しいです。 –

0

を:

def get(): 
    return [0] * 3 

r = [] 
r.extend(get()) 
r 
[0, 0, 0] 
0

???

def get(): 
    for i in xrange(3): 
     yield 0 

r = list(get()) 

print r 

または

gen = (0 for i in xrange(3)) 

r = list(gen) 

print r 
+0

私は既に[someint]を返す関数を持っています。私はそれを変更できません – nkint

1

get()は、サイズ1のlistにそれが呼び出されるたびに返すジェネレータですので、あなたがi[0]を使用する必要がされている理由があります。コードi[0] for i in get()i[0] for i in ([0],[0],[0])と同じです。あなたのコードが動作する理由は、i[0]が返された要素の最初の要素を取得します。それ自体はlist [0]です。

私があなたの質問から集めたのは、あなたがi for i in [0,0,0]を持ちたいということです。他の答えで述べたように、これはlist[0]の代わりにint0になるようにジェネレータを変更することで実現できます。次のコード例では、発電機の結果を見ることができます:

>>> for i in get(): 
... print("i={} and i[0]={}".format(i, i[0])) 
... 
i=[0] and i[0]=0 
i=[0] and i[0]=0 
i=[0] and i[0]=0 

あなたが見ることができるように、あなたの発電機がすべての反復[0]を返し、それはあなたがそれぞれの最初の要素を取得するためにi[0]を使用する必要が理由ですリスト。 rは、発電機の結果だけであるので、

また、あなただけの次のようにして簡略化することができます(GETで私は[0] iに対する())

>>> def gen(): 
... for i in range(3): 
...  yield 0 
... 
>>> r = list(gen()) 
>>> r 
[0, 0, 0]