2016-04-09 12 views
-1

Was ist der kürzeste Weg wäre, die Anzahl der ungeraden Zahlen in einer Liste von Listen wie dieser mit beliebigen Abmessungen, die nicht unbedingt 5x5 zu zählen:Count Chancen in der Liste der Listen

list_of_lists = [[1, 2, 3, 4, 5], 
       [1, 2, 3, 4, 5], 
       [1, 2, 3, 4, 5], 
       [1, 2, 3, 4, 5], 
       [1, 2, 3, 4, 5]] 

Ich habe versucht, aber ich d schätze, dass es kürzer:

counter = 0 
for row in list_of_lists: 
    for i in row: 
     if i % 2 != 0: 
      counter += 1 
print(counter) 

Antwort

4

Wenn Sie immer in der Hauptliste eine Ebene der flachen Listen haben, können Sie eine innere Schleife verwenden das Ergebnis jeder i % 2 abzuflachen, Summieren, die für noch 1 für ungerade und 0 sein Nummern:

list_of_lists = [[1, 2, 3, 4, 5], 
       [1, 2, 3, 4, 5], 
       [1, 2, 3, 4, 5], 
       [1, 2, 3, 4, 5], 
       [1, 2, 3, 4, 5]] 

print(sum(i % 2 for sub in list_of_lists for i in sub)) 

Oder verwenden itertools.chain die Abflachung zu tun:

from itertools import chain 

print(sum(i % 2 for i in chain(*list_of_lists))) 

Wenn Sie beliebige Verschachtelung hätte, würde Rekursion eine einfache Möglichkeit, um das Problem zu nähern:

def flat(lst): 
    for i in lst: 
     if isinstance(i, list): 
      for j in flat(i): 
       yield j % 2 
     else: 
      yield i % 2 

print(sum(flat(list_of_lists))) 
+0

Dank @Padraic Cunningham! Sehr nette Antwort, und extrem schnell :) – Zorgmorduk

+0

Eigentlich funktioniert Ihre ursprüngliche Lösung bereits für Größe und Anzahl der Listen. – Zorgmorduk

+0

@ Zorgmorduk, die Rekursion wäre nur, wenn Sie Listen in Listen in Listen hatten ... –

1

Die numpy Weg des Zählens ein Kontrast:

import numpy as np 
list_of_lists = [[1, 2, 3, 4, 5], 
       [1, 2, 3, 4, 5], 
       [1, 2, 3, 4, 5], 
       [1, 2, 3, 4, 5], 
       [1, 2, 3, 4, 5]] 

l = np.array(list_of_lists) 
print len(l[l%2!=0]) 

l[l%2!=0] gibt alle Elemente zurück, die die Bedingung l%2!=0 und len() erfüllen.

PS: Dies setzt natürlich voraus, dass die list_of_lists rechteckig ist. Für eine Lösung, die unterschiedliche Länge für jede innere Liste erlaubt, siehe die Antwort von Padraic.