Ist es möglich, so etwas zu tun:

l = [1, 2, 2, 3, 4, 4, 1, 1]
d = {num: [num] if num not in d else d[num].append(num) for num in l}

Inhärent würde ich das nicht denken, ohne zuerst d = {} zu deklarieren; selbst dann hängt es nicht an:

Output: {1: [1], 2: [2], 3: [3], 4: [4]}
# desired: {1: [1, 1, 1], 2: [2, 2], 3: [3], 4: [4, 4]}

Könnte ein defaultdict verwenden, neugierig, ob das Verständnis überhaupt möglich ist?

2
pstatix 18 Apr. 2018 im 17:42

2 Antworten

Beste Antwort

Nein, es ist nicht möglich. Wenn Sie darüber nachdenken, wird es Sinn machen, warum. Wenn Python eine Zuweisungsanweisung auswertet, wertet es zuerst die rechte Seite der Zuweisung aus - den Ausdruck. Da noch nicht die gesamte Zuordnung ausgewertet wurde, wurde die Variable auf der linken Seite noch nicht zum aktuellen Namespace hinzugefügt. Während der Auswertung des Ausdrucks ist die Variable undefiniert.

Wie vorgeschlagen, können Sie collections.defaultdict verwenden, um das zu erreichen, was Sie wollen:

>>> from collections import defaultdict
>>> 
>>> l = [1, 2, 2, 3, 4, 4, 1, 1]
>>> d = defaultdict(list)
>>> for num in l:
        d[num].append(num)


>>> d
defaultdict(<class 'list'>, {1: [1, 1, 1], 2: [2, 2], 3: [3], 4: [4, 4]})
>>> 
2
Christian Dean 18 Apr. 2018 im 15:56

Nein, Sie können sich nicht auf Ihr Listenverständnis beziehen, bevor das Verständnis einer Variablen zugewiesen wurde.

Sie können jedoch collections.Counter verwenden, um diese kostspieligen list.append Anrufe zu begrenzen.

from collections import Counter

l = [1, 2, 2, 3, 4, 4, 1, 1]

c = Counter(l)
d = {k: [k]*v for k, v in c.items()}

# {1: [1, 1, 1], 2: [2, 2], 3: [3], 4: [4, 4]}

Verwandte Themen: Liste der einzelnen Elemente erstellen, die n Mal in Python wiederholt wurden

1
jpp 18 Apr. 2018 im 15:23