Seite 1 von 1

verschachtelte Liste mit list comprehension

Verfasst: Mittwoch 3. November 2021, 23:44
von joeymds
Hallo, ich versuche aus einer liste L mit zahlen aus 0-9 mit beliebigen Häufigkeiten eine verschachtelte liste d zu erstellen wo dann immer die zahl und Häufigkeit der zahl ausgegeben wird. Wie das mit zwei for schleifen Funktioniert hab ich, ich würde es gerne aber mit list comprehension mach, jedoch habe ich zwei sachen die ich hinzufügen möchte.
DAs wäre meine "lange" Lösung:

Code: Alles auswählen

d=[ ]
for i in range(10):
    d.append([ ])
    for j in range(1):
        d[i].append(i)
        d[i].append(L.count(i))  
print(d)
und so in der art hab ichs mir vorgestellt und auch versucht:

Code: Alles auswählen

d =[ [ i , L.count(i) for i in range (1)] for j in range(10)]
meine frage wäre, ist das überhaupt möglich und wenn ja wie ^^

mfg Joey

Re: verschachtelte Liste mit list comprehension

Verfasst: Donnerstag 4. November 2021, 00:03
von sparrow
Zuerst möchtest du deinen Variablen vernünftige Namen geben. d und L sind das nicht. "L" suggeriert durch seine Großschreibung, dass es sich um einen Klassennamen handelt, denn alle anderen Namen werden in Python klein_mit_unterstrich geschrieben. Außer KONSTANTEN (komplett groß) und eben Klasse, die PacalCase geschrieben werden.

Bist du dir sicher, dass du eine verschachtelte Liste willst und nicht eher ein dict?!

Benutze einfach collections.Counter denn Python hat bekanntlich Batteries included.

Re: verschachtelte Liste mit list comprehension

Verfasst: Donnerstag 4. November 2021, 00:11
von pillmuncher
Mit collections.Counter:

Code: Alles auswählen

>>> import collections
>>> import random
>>> numbers = random.choices([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], k=100)
>>> numbers
[0, 6, 0, 9, 7, 2, 4, 8, 9, 6, 6, 2, 9, 3, 4, 8, 4, 1, 4, 0, 4, 9, 2, 8, 4, 2, 0, 1, 0, 5, 7, 8, 1, 5, 1, 5, 8, 5, 8, 1, 9, 2, 1, 4, 6, 3, 5, 2, 3, 2, 9, 3, 5, 9, 9, 5, 9, 0, 5, 0, 5, 8, 2, 4, 8, 3, 2, 9, 0, 2, 9, 8, 4, 1, 6, 5, 3, 1, 4, 7, 0, 4, 2, 0, 9, 0, 8, 8, 7, 8, 3, 5, 6, 7, 3, 8, 6, 9, 8, 7]
>>> collections.Counter(numbers)
Counter({8: 14, 9: 13, 0: 11, 2: 11, 4: 11, 5: 11, 3: 8, 1: 8, 6: 7, 7: 6})
Mit List Comprehension:

Code: Alles auswählen

>>> [[i, numbers.count(i)] for i in range(10)]
[[0, 11], [1, 8], [2, 11], [3, 8], [4, 11], [5, 11], [6, 7], [7, 6], [8, 14], [9, 13]]
Wie man sieht, braucht man gar keine doppelt verschachtelte List Comprehension. Aber auch so ist es im Vergleich zur Lösung oben schlecht, weil die Liste numbers hier zehnmal durchsucht werden muss.

Re: verschachtelte Liste mit list comprehension

Verfasst: Donnerstag 4. November 2021, 06:38
von Sirius3
j wird gar nicht genutzt, und eine Schleife, die exakt einmal durchlaufen wird, ist überflüssig. Man greift auf Listen nicht per Index zu, wenn es nicht unbedingt nötig ist.

Code: Alles auswählen

amounts = [ ]
for i in range(10):
    element = []
    element.append(i)
    element.append(L.count(i))
    amounts.append(element)
print(amounts)
Die innere Listen wären besser Tuple:

Code: Alles auswählen

amounts = [ ]
for i in range(10):
    amounts.append((i, L.count(i)))
print(amounts)
Deine ursprüngliche innere for-Schleife kann man nicht in eine Listcomprehension umwandeln, weil pro Schleifendurchgang zwei Elemente angehängt werden.

Re: verschachtelte Liste mit list comprehension

Verfasst: Donnerstag 4. November 2021, 10:26
von snafu
Sirius3 hat geschrieben: Donnerstag 4. November 2021, 06:38 Deine ursprüngliche innere for-Schleife kann man nicht in eine Listcomprehension umwandeln, weil pro Schleifendurchgang zwei Elemente angehängt werden.
Ist die innere Schleife etwa nicht mit 2-elementrigen Tupeln darstellbar? 🤔

Re: verschachtelte Liste mit list comprehension

Verfasst: Donnerstag 4. November 2021, 11:08
von __deets__
@snafu: dann ist ist sie aber strukturell anders und bräuchte wenigstens noch ein flatten drumrum. Außer die Anforderung ändert sich, aber das weiß nur der TE.