2011-10-07 16 views
9

Liste anlaşmasında çoklu komutların nasıl gerçekleştirileceğini bilmek istiyorum. Ben olurdu bu yüzdenListe anlama pythonunda çoklu eylemler

[print ("bla1") and print ("bla2") for i in list] 

4 uzunluğunda 4 listesi için:

bla1 
bla2 
bla1 
bla2 
bla1 
bla2 
bla1 
bla2 

Dtrangely yeterince kolayca bulamadık

Bana gibi basit bir şey için bir örnek verebilir dokümantasyonda. (Bunun nedenini açık bir şekilde görebildim ve bana bildirmeme izin verebilirseniz, daha iyi olacak olan şeyleri nasıl arayabilirim?).

DÜZENLEME: Tamam, bu yorumlara göre çok kötü bir örnekti. I , eskiden yeni bir tane oluşturmakla ilgileniyor ancak bunu yapmak için iki komut gerektirdiğimi hissediyorum. (elbette basit bir baskı değil). Örneğin, . Listelerim var ve alt listelerin manipülasyonunun sonucu olan bir liste oluşturmak istiyorum.

+2

Eğer liste anlamalarınızı çok karmaşık hale getirirseniz, bunların anlaşılması mümkün olmayacaktır! –

+0

Python 3'te 'print 'bir işlevdir, bu kodun basit bir varyantı çalışır. Yine de, bunu yapmak için hala kötü bir yol. –

+0

"iki komut"? Bununla kastettiğinizi düşündüğünüzden örnekler verebilir misiniz? Net değil. Bir "komut", herhangi bir resmi Python anlamına gelmez. "Deyim" mi demek istiyorsun? Eğer öyleyse, liste kavraması işe yaramaz. "İşlev" mi yoksa "ifade" mi demek istiyorsun? Öyleyse, bir örnek niçin iki ifadenin açıklığa kavuşturulmasına yardımcı olur. –

cevap

21

Komutlar için liste kavramalarını kullanmayın. Listeyi anlama listelerini oluşturur, komutlar için değildir. Bir düz eski döngü kullanın:

for i in list: 
    print('bla1') 
    print('bla2') 

Liste comprehensions boynuzlu atlar ve çikolata dolu harika inanılmaz şeyler, ama her şey için bir çözüm değil.

+3

Onlara sihirli demezdim. – varunl

+2

Haklısınız. Ne demek istediğimi açıklığa kavuşturdum, umarım olumsuz çağrışımlar olmadan. –

+0

KEP'te bunu belirten bir şey var mıdır, yoksa sadece insanların takip etme eğiliminde olduğu bir konvansiyon mu? Komutlar için liste-derlemeleri kullanan birçok insan görüyorum. –

2
  1. Liste comprehensions değil birden çok kez (bir dosyaya yazmak gibi, ya da başka herhangi bir yan etkisi) ifadeleri çalıştırmak için, liste biçiminde veri oluşturmadan içindir. Bunun için bir for kullanın. Bir liste oluşturmak istediğinizi farz edelim ['bla1', 'bla2', 'bla1', ...]: Genel olarak bunu yapamazsınız, her yineleme, listeye tek bir sonuç değeri koyar. Bu değer bir listenin kendisi olabilir, ancak bir liste listeniz var. Her x in list için range(2) üzerinde hangi yinelediğinden Kullanım ['bla' + str(i + 1) for x in list for i in range(2)] ve böylece list yılında ürün başına iki değeri oluşturur: sizin örnekte olduğu gibi belirli durumlarda

  2. , olsa mümkündür. (Zaten yerleşiği tarafından almış olduğu list olsa bir değişken için kötü isimdir.)

1

"İki komutları gerek" Eğer onlar bir şekilde ilişkili olmalıdır iki fonksiyon olmadığı anlamına gelir. Bu uygun değilse

def f(element): 
    return intermediate 

def g(intermediate): 
    return final 

new_list = [ g(f(x)) for x in old_list ] 

için (a) oluşan ve henüz da (b) yeni sekans için tek bir sonuç yaratmak olamaz fonksiyonların tanımlarının verilmesi gerekecek.

0

Liste oluşturmayı yalnızca listeler oluşturmak için kullanın. Örneğiniz listenizin değerlerini hiç kullanmıyor.

Dokümanlara göre:
"Anlamaları listelemek, dizilerden listeler oluşturmanın kısa bir yolunu sunar." Yukarıdaki programda, listedeki değerlere bile dikkat etmedik. Bu programda, yukarıdaki değerleri dikkate almıyoruz bile...........Sorunuzda belirtmiş olduğunuzdan farklı bir liste kavrayışını arıyorsanız, o zaman gönderin.

0

Bunun için liste anlamanın birincil çıktısını göz ardı ederken yeni bir liste oluşturmak için liste kavramasında list.append'in kullanılması mümkündür. OP bir liste listesinden bahseder. Ayrıca

>>> master = [range(x,x+2) for x in range(10)] 
>>> master 
[[0, 1], [1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7], [7, 8], [8, 9], [9, 10]] 

Sonra Bu Nones ile listelerin yedekli liste tükürmek yok

>>> new_list = [] 
>>> [[new_list.append(l[0]*l[1]),new_list.append(l[0]+l[1])] for l in master] 

[[None, None], [None, None], [None, None], [None, None], [None, None], [None, None], [None, None], [None, None], [None, None], [None, None]] 

>>> new_list 

[0, 1, 2, 3, 6, 5, 12, 7, 20, 9, 30, 11, 42, 13, 56, 15, 72, 17, 90, 19] 

(düzenleme tarif OP gibi) her alt listesini işleyerek yeni bir liste oluşturmak, ancak: Örneğin atın Yeni_list değişkenini ürün ve alt listelerin toplamı ile doldurur.

6

Böyle olduğu işini yaptığı için başlığın kullanabilirsiniz:

[(print("bla1"), print("bla2")) for i in list] 

bu işi doğru bu.

+0

bu bana yardım etti ... sadece 'tuple' içinde yazmanın neden işlediğini merak ettim? –