verschachtelte Liste mit list comprehension

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
joeymds
User
Beiträge: 1
Registriert: Mittwoch 3. November 2021, 23:32

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
Benutzeravatar
sparrow
User
Beiträge: 4540
Registriert: Freitag 17. April 2009, 10:28

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.
Benutzeravatar
pillmuncher
User
Beiträge: 1530
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

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.
In specifications, Murphy's Law supersedes Ohm's.
Sirius3
User
Beiträge: 18278
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Benutzeravatar
snafu
User
Beiträge: 6873
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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? 🤔
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

@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.
Antworten