2016-09-23 3 views
0

Ich habe zwei Listen, die ich in einem Wörterbuch wird‚NoneType‘ Objekt hat kein Attribut ‚append‘

keys = ['p2p', 'groupchat'] 
tests_available = ['p2p_1', 'p2p_2', 'p2p_3', 'groupchat_1', 'groupchat_2'] 

Die erwartete Ausgabe Verschmelzung so etwas wie

{'p2p': ['p2p_1', 'p2p_2', 'p2p_3'], 'groupchat': ['groupchat_1', 'groupchat_2'] 
} 

Mein Code zu erstellen Das Wörterbuch ist unten.

out = {} 
out = dict.fromkeys(keys) 

for tests in tests_available: 
    if tests.split('_')[0] in keys: 
     key = tests.split('_')[0] 
     out[key].append(tests) 

Es wird jedoch den Fehler ‚NoneType‘ Objekt zu werfen hat kein Attribut ‚anhängen‘, wenn es versucht, die Werte auf den Schlüssel anzuhängen. Kann mir jemand helfen, herauszufinden, was in meinem Code falsch ist?

+0

Ihr Dict ist anfänglich leer in Bezug auf seine Elemente, Sie versuchen ein Dict mit Listen als Wert zu kompilieren, aber es gibt keine Liste für diesen Schlüssel, daher der Fehler, so dass Sie entweder ein Standarddict verwenden können, wo die Standardwerte sind sind leere Listen oder prüfen, ob der Schlüssel existiert oder nicht und erstellen eine Liste, wenn der Schlüssel nicht existiert – EdChum

Antwort

3

Wenn Sie Anruf als Wert arbeitet dann das Anfügen eines defaultdict verwenden geben Sie standardmäßig eine Liste:

In [269]: 
from collections import defaultdict 
keys = ['p2p', 'groupchat'] 
tests_available = ['p2p_1', 'p2p_2', 'p2p_3', 'groupchat_1', 'groupchat_2'] 
d = defaultdict(list) 
for test in tests_available: 
    k = test.split('_')[0] 
    if k in keys: 
     d[k].append(test) 
d.items() 

Out[269]: 
dict_items([('p2p', ['p2p_1', 'p2p_2', 'p2p_3']), ('groupchat', ['groupchat_1', 'groupchat_2'])]) 

die Dokumentation Siehe: https://docs.python.org/2/library/collections.html#defaultdict-examples

+0

Das würde möglicherweise neue Schlüssel/Wert-Paare hinzufügen, die nicht erwünscht sind. –

+0

@PadraicCunningham ah ja, es; s testet nicht für die Mitgliedschaft in 'Schlüssel', wird aktualisiert danke – EdChum

+0

Ich würde vorschlagen, das gleiche, aber nicht als das OP scheint auf bestimmte Schlüssel zu überprüfen, obwohl das kann nur wie sein passiert, um das Problem anzugehen. +1 sowieso, es könnte tatsächlich sein, was sie wollen. –

3

sind Ihre Werte zu Keine in fromkeys gesetzt es sei denn, Sie explizit einen Wert gesetzt:

fromkeys (f [, Wert])

ein neues Wörterbuch erstellen mit Schlüsseln aus seq und Werte auf Wert gesetzt. fromkeys() ist eine Klassenmethode, die ein neues Wörterbuch zurückgibt. Standardwert ist Kein.

In Ihrem Fall müssen Sie Listen als Werte für jeden Schlüssel erstellen:

d = {k:[] for k in keys} 

Sie auch Ihre tun können, wenn Überprüfung der dict mit:

d = {k:[] for k in keys} 

for test in tests_available: 
    k = tests.split('_', 1)[0] 
    if k in d: 
     d[k].append(test) 

Sie einen Wert übergeben können Verwenden Sie fromkeys, aber es muss unveränderlich sein oder Sie werden das gleiche Objekt unter allen Schlüsseln teilen.

1

Für eine kleine Anzahl von Tasten/testet ein Wörterbuch Verständnis als gut funktionieren würde:

keys = ['p2p', 'groupchat'] 
tests_available = ['p2p_1', 'p2p_2', 'p2p_3', 'groupchat_1', 'groupchat_2'] 
out = {k: [v for v in tests_available if v.startswith(k)] for k in keys} 

Demo:

>>> out 
{'groupchat': ['groupchat_1', 'groupchat_2'], 'p2p': ['p2p_1', 'p2p_2', 'p2p_3']} 
Verwandte Themen