2012-03-31 41 views
2

Ich habe eine Liste wie p = [[[[[[[[1, 2, 3]]]]]]]], ich möchte die Anzahl der Elemente in der Liste einschließlich der leeren Listen, so dass ich für diese Liste 10 bekommen. Ich versuche, die Liste wie zu nummerieren -Zählen Unterlisten in einer Liste in Python

for idx, item in enumerate(p): 
    count = count + idx 

aber ich bin nicht in der Lage, die leeren Listen dort zu bekommen. Bitte um Rat.

+3

Es sind keine leeren Listen drin. – jamylak

+0

Können Sie erklären, wie Sie 10 für diese Liste bekommen? –

+0

Er zählt die Anzahl der Elemente in jeder Liste und fügt sie zusammen – jamylak

Antwort

6

Kürzere Version des Codes unter:

>>> def recur_len(l): 
     return sum(1 + recur_len(item) if isinstance(item,list) else 1 for item in l) 

>>> recur_len([[[[[[[[1, 2, 3]]]]]]]]) 
10 

Detailliertere Code

>>> def recur_len(l): 
     count = 0 
     for item in l: 
      if isinstance(item,list): 
       count += 1 + recur_len(item) 
      else: 
       count += 1 
     return count 

>>> recur_len([[[[[[[[1, 2, 3]]]]]]]]) 
10 
+0

+1 Ich werde meine Antwort lassen, aber das ist, was eigentlich vom OP gewünscht wurde. Der Wortlaut der Frage war nicht sehr klar und das Beispiel zweideutig. –

+0

Ja, ich stimme zu, ich habe die ganze 'leere Liste Sache' nicht verstanden – jamylak

+0

Danke, wird das nächste Mal beschreibender sein. Jetzt ist es Zeit zu sitzen und zu lernen, wie dieser Code es funktioniert, danke viel – Varun

2

Wenn Sie nur Listen (oder Unterklassen von list) und sonst nichts, außer den Inhalt der endgültigen Liste zählen möchten nicht nur eine andere Liste enthält:

def len_counting_containers(inlist): 
    count = 0 
    current = inlist 
    while len(current) == 1 and isinstance(current[0], list): 
     count += 1 
     current = current[0] 
    return count + len(current) 

len_counting_containers([[[[[[[[1, 2, 3]]]]]]]]) 

Was uns gibt:

10 

Beachten Sie, dass dies eine ziemlich zerbrechliche Operation ist (wie in jedem Fall verwenden Sie isinstance() in Python) - so wollen Sie sicher sein, dass Ihre eingehenden Daten immer so strukturiert sind, wie Sie es erwarten. Wenn Ihre Daten aus einer von Ihnen kontrollierten Quelle stammen, würde ich empfehlen, zu prüfen, wie Sie die Daten erstellen und sehen, ob Sie sie in einer besseren Form angeben können - z. B. (7, [1,2,3]).

Sie könnten auch diese rekursiv implementieren:

def len_counting_containers(current): 
    return len_counting_containers(current[0])+1 if len(current) == 1 and isinstance(current[0], list) else len(current) 

len_counting_containers([[[[[[[[1, 2, 3]]]]]]]]) 

Dies ergibt das gleiche Ergebnis in weniger Code, aber wenn Sie mit einem irrsinnig großen Listen arbeiten diese Rekursion Grenzen stoßen könnte.

+0

Danke, ich bin ein Newbee hier so versucht zu begreifen, so viel wie ich kann, was passiert, wenn ich Liste zu myList = ([1, [1, 2, [3, 4]]]), ich bekomme nur 2 für diese Operation, aber ich habe 7 Dinge dort, bitte erkläre, ich werde versuchen, mich selbst zu kodieren – Varun

+0

Ah, du hast gesagt 'leere Listen', also nahm ich an, du meinst Listen mit nur einer Artikel. Ich denke [Jamylaks Antwort] (http://stackoverflow.com/a/9955769/722121) macht was du willst. –

2
def depth(a): 
    return 1 + depth(a[0]) if type(a) is list else 0 

Demo:

a = 'x' 
for n in range(10): 
    a = [a] 
    print a, depth(a) 


## ['x'] 1 
## [['x']] 2 
## [[['x']]] 3 
## [[[['x']]]] 4 
## [[[[['x']]]]] 5 
## [[[[[['x']]]]]] 6 
## [[[[[[['x']]]]]]] 7 
## [[[[[[[['x']]]]]]]] 8 
## [[[[[[[[['x']]]]]]]]] 9 
## [[[[[[[[[['x']]]]]]]]]] 10 
+0

'code' def deep_count (p): \t sum = 0 \t für e in p: \t \t sum = sum + 1 \t \t wenn is_list (e): \t \t \t sum = sum + deep_count (e) \t Rückgabesumme 'code' – Varun

Verwandte Themen