2012-01-01 16 views
10

Normalde, liste kavramaları mevcut bir listeden yeni bir liste türetmek için kullanılır. Örneğin: Başka işlemler yapmak için bunları kullanmalı mıyız? liste anlamalarının doğru kullanımı - python

>>> a = [1, 2, 3, 4, 5] 
>>> [i for i in a if i > 2] 
[3, 4, 5] 
Ör:

>>> a = [1, 2, 3, 4, 5] 
>>> b = [] 
>>> [b.append(i) for i in a] 
[None, None, None, None, None] 
>>> print b 
[1, 2, 3, 4, 5] 

veya yukarıda önlemek ve bunu yapmak için en mantıklı olur vermek örnekte yerine aşağıdaki ?:

for i in a: 
    b.append(i) 

cevap

10

Sen gerçekten Sözlük comprehensions birlikte (Liste comprehensions kullanmaktan kaçınmalısınız, comprehensions set yan etkiler için ve jeneratör ifadeleri). Sahte bir liste biriktirip hafızayı boşa harcadıkları gibi, kafa karıştırıcı da oluyor. Bir liste anlamının (anlamlı) bir değer yaratmasını beklerim ve bir çoğu da aynı fikirde olur. Diğer taraftan döngüler açıkça bir dizi ifadedir. Yan etkilere başlaması ve sonuç değeri üretmemesi bekleniyor - sürpriz yok. piton belgelerine

2

kullanmalıdır:

b = [i for i in a] 

eğer bir sebepten dolayı yaratmak istediniz b. Genel olarak, istihdam edilmesi gereken bazı sağduyu vardır. Bir anlama kullanıyorsanız, kodunuzu okunamaz hale getirirseniz, onu kullanmayın. Aksi takdirde bunun için gidin.

+1

'b = a [:]' da çalışırdı ... –

2

Sadece oluşturulmuş listeyi kullanmayı planlıyorsanız liste anlamalarını kullanın. Aksi takdirde, sadece GC'nin hiç kullanılmadan tekrar atmasını sağlayabilirsiniz.

Bunun yerine [b.append(i) for i in a] size döngü için uygun kullanmalıdır:

for i in a: 
    b.append(i) 

Başka bir çözüm, bir jeneratör ifade yoluyla olacaktır: Eğer eklemek istiyorsanız,

b += (i for i in a) 

Ancak Tüm liste, sadece

b += a 

Ve sadece listeye ekleyerek önce elemanlarına bir işlevi uygulamak gerekiyorsa, her zaman map kullanabilirsiniz:

b += map(somefunc, a) 
+0

(Çok kötü) örnek üzerinde çok fazla odaklandığınıza inanıyorum. – delnan

+0

Asıl soru en başında cevaplandırılır - örnekle ilgili olan şey sadece kullanıcıya alternatifler hakkında fikir vermektir. – ThiefMaster

0
b = [] 
a = [1, 2, 3, 4, 5] 
b.extend (a)