2011-10-21 22 views
23

Używam wielu macierzy N wymiarowych i sprawia to ból, że muszę napisać taki kod z wcięciem i wiem, że niektóre kody można zastąpić wyliczeniami listowymi i instrukcjami inline. Na przykład:Zrozumienie listy dla pętli Python

for x in (0,1,2,3): 
    for y in (0,1,2,3): 
     if x < y: 
      print (x, y, x*y) 

można zastąpić:

print [(x, y, x * y) for x in (0,1,2,3) for y in (0,1,2,3) if x < y] 

Ale jak mogę zmienić działanie zamiast druku zrobić coś innego jak:

total = x+y 

Więc co chcę to jest coś takiego:

[(total+=x+y) for x in (0,1,2,3) for y in (0,1,2,3) if x < y] 

Jednak to nie działa

Czy istnieje elegancki sposób to zrobić zamiast:

for x in (0,1,2,3): 
     for y in (0,1,2,3): 
      if x < y: 
       total+=x+y 
+0

a może użyjesz lepszego edytora, który planuje dla ciebie, ponieważ to wydaje się być twoim rzeczywistym problemem. Moim zdaniem oryginalny kod, który wysłałeś jako przykład, jest najłatwiejszy do odczytania. –

Odpowiedz

30

sum pracuje tutaj:

total = sum(x+y for x in (0,1,2,3) for y in (0,1,2,3) if x < y) 
+0

To zdecydowanie najłatwiejsze do zrozumienia rozwiązanie. – oligofren

5

użytkowania numpy. To pozwala na korzystanie z tablic, które dodają się jak wektory:

x = numpy.arange(3) 
y = numpy.arange(3) 
total = x + y 

Dzięki zmodyfikowanej pytanie, dodać wywołanie do sum oraz

total = numpy.sum(x+y) 
12

Jako alternatywę do pisania pętle głębokie poziomy N, można użyć itertools.product():

In [1]: import itertools as it 

In [2]: for x, y in it.product((0,1,2,3),(0,1,2,3)): 
    ...:  if x < y: 
    ...:   print x, y, x*y 

0 1 0 
0 2 0 
0 3 0 
1 2 2 
1 3 3 
2 3 6 

To w naturalny sposób rozszerza się do N wymiarów.

+0

+1 dla itertools! –

2

Zmniejszyć funkcja bezpośrednio zmniejsza zbiorowych przedmiotów do pojedynczego elementu. Można read more about them here, ale to powinno działać dla Ciebie:

total=reduce(lambda x,y:x+y,range(4)) 

lub

total=reduce(lambda x,y:x+y,(0,1,2,3)) 
2

Inną możliwością jest:

for x,y in ((x,y) for x in (0,1,2,3) for y in (0,1,2,3) if x < y): 
    print (x, y, x * y) 

W ten sposób można iteracyjne nad czymkolwiek chcesz wykorzystać w zrozumienie listy bez faktycznego tworzenia zrozumiałej listy (jeśli rozumiesz znaczenie;) Jeśli zrozumiana lista jest duża, może tak duża, że ​​nasyca się lub nawet nie mieści się w pamięci, to całkiem przydatne ..

Powiązane problemy