2011-10-07 16 views
9

Chciałbym wiedzieć, jak wykonywać wiele poleceń w zrozumieniu listy.wiele akcji w pytaniu na zrozumienie listy

Czy możesz dać mi przykład czegoś prostego, takich jak:

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

więc na liście 4 długości 4 musiałbym:

bla1 
bla2 
bla1 
bla2 
bla1 
bla2 
bla1 
bla2 

Dtrangely na tyle, że nie łatwo go znaleźć w dokumentacji. (Jeśli widzisz oczywisty powód, dlaczego nie wiedziałem i mogę dać mi znać, jak powinienem szukać takich rzeczy, które byłyby jeszcze lepsze).

EDYCJA: OK, to był bardzo zły przykład według komentarzy. I am zainteresowany tworzeniem nowego ze starego, ale czuję, że potrzebuję dwóch poleceń, aby to zrobić. (Oczywiście nie jest to zwykły wydruk). Na przykład. Mam listę list i chcę utworzyć listę, która jest wynikiem manipulacji podlistami.

+2

Jeśli sprawisz, że lista będzie zbyt skomplikowana, prawdopodobnie staną się ... niezrozumiałe! –

+0

W Pythonie 3, gdzie 'print' jest funkcją, działa prosty wariant tego kodu. Jednak nadal jest to zły sposób na zrobienie tego. –

+0

"dwa polecenia"? Czy możesz podać przykłady tego, co według ciebie masz na myśli? To nie jest jasne. "Polecenie" nie ma żadnego formalnego znaczenia w Pythonie. Czy masz na myśli "oświadczenie"? Jeśli tak, to zrozumienie listy nie może działać. Masz na myśli "funkcję" lub "ekspresję"? Jeśli tak, przykład pomoże wyjaśnić, dlaczego są to dwa wyrażenia. –

Odpowiedz

21

Nie używaj do sprawdzania listy poleceń. Wykazy list są dla tworzenia list, a nie dla poleceń. Użyj zwykły starą pętlę:

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

listowe są wspaniałymi niesamowite rzeczy pełne jednorożce i czekolady, ale nie są rozwiązaniem dla wszystkich.

+3

Nie nazwałbym ich magicznymi. – varunl

+2

Masz rację. Wyjaśniłem, o co mi chodziło, mam nadzieję, że bez negatywnych konotacji. –

+0

Czy jest coś w PEP, które to określa lub czy jest to tylko konwencja, którą ludzie zwykle podążają? Widzę mnóstwo osób używających komend list-comps. –

2
  1. Ułatwienia liście są tylko do generowania danych w formie listy, a nie do wykonywania instrukcji (lub innych skutków ubocznych, takich jak pisanie do pliku) wiele razy. Użyj tego stylu.

  2. Zakładając, że chcesz wygenerować listę ['bla1', 'bla2', 'bla1', ...]: Nie możesz tego zrobić ogólnie, każda iteracja umieszcza pojedynczą wartość wyniku na liście. Ta wartość może być samą listą, ale wtedy masz listę list.

  3. W szczególnych przypadkach, takich jak Twój przykład, możliwe, choć Use ['bla' + str(i + 1) for x in list for i in range(2)], który wykonuje iteracje nad range(2) dla każdego x in list, a tym samym generuje dwie wartości za przesyłkę z list. (list jest zła nazwa zmiennej choć, jak to już zajęta przez polecenie wbudowane.)

1

Jeśli „Potrzebuję dwa polecenia” oznacza, że ​​istnieją dwie funkcje, muszą być w jakiś sposób powiązane.

def f(element): 
    return intermediate 

def g(intermediate): 
    return final 

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

Jeśli nie jest to właściwe, będziesz musiał dostarczyć definicje funkcji, które (a) nie może być złożony i jeszcze także (b) tworzą pojedynczy wynik dla nowej sekwencji.

0

Używanie rozumienia list tylko do tworzenia list. Twój przykład w ogóle nie wykorzystuje wartości twojej listy.

Zgodnie z dokumentacją:
"Zrozumienia list stanowią zwięzły sposób tworzenia list z sekwencji."

for i in range(len(your_list)): 
    print "blah1" 
    print "blah2" 

W powyższym programie nie uwzględniliśmy nawet wartości na liście.Jeśli szukałeś innej aplikacji ze zrozumieniem list niż to, co napisałeś w swoim problemie, to postuj.

0

Za to, co warto jest wykorzystać, użyj listy.zostań w spisie ze zrozumieniem, aby utworzyć nową listę, ignorując pierwotne dane wyjściowe ze spisu. OP zawiera listę list. Weźmy na przykład:

>>> 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]] 

Następnie należy utworzyć nową listę poprzez manipulowanie każdym podmenu (jako OP opisaną w Edit)

>>> 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] 

To nie wypluć redundantny listę list z Nones, ale również wypełnia zmienną new_list produktem i sumą podlist.

6

Można użyć krotki do wykonywania tej pracy tak:

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

to właściwie praca.

+0

pomogło mi to ... Zastanawiam się, dlaczego pisanie w kodzie 'działało? –