Ho un dizionario d1
e un elenco l1
.Comprensione del dizionario Python molto lenta
Le chiavi del dizionario sono stringhe e i valori sono Oggetti che ho definito io. Se è utile, posso descrivere l'oggetto in maggiore dettaglio ma per ora gli oggetti hanno un attributo di lista names
e alcuni degli elementi di name
possono o non possono apparire in l1
.
Quello che volevo fare era di buttare via qualsiasi elemento del dizionario d1
, in cui l'attributo name
dell'oggetto in detto elemento non contiene nessuno degli elementi che appaiono in l1
.
Come esempio banale:
l1 = ['cat', 'dog', 'mouse', 'horse', 'elephant',
'zebra', 'lion', 'snake', 'fly']
d1 = {'1':['dog', 'mouse', 'horse','orange', 'lemon'],
'2':['apple', 'pear','cat', 'mouse', 'horse'],
'3':['kiwi', 'lime','cat', 'dog', 'mouse'],
'4':['carrot','potato','cat', 'dog', 'horse'],
'5':['chair', 'table', 'knife']}
così dizionario risultante sarà più o meno lo stesso ma gli elementi di ciascuna lista saranno le coppie di valori-chiave da 1
a 4
esclusione degli ortofrutticoli, e non conterrà un quinto valore chiave-valore in quanto nessuno dei valori del mobilio appare in l1
.
Per fare questo ho usato un elenco nidificato/comprensione dizionario che si presentava così:
d2 = {k: [a for a in l1 if a in d1[k]] for k in d1.keys()}
print(d2)
>>>>{'1': ['dog', 'mouse', 'horse'],
'3': ['cat', 'dog', 'mouse'],
'2': ['cat', 'mouse', 'horse'],
'5': [],
'4': ['cat', 'dog', 'horse']}
d2 = {k: v for k,v in d2.iteritems() if len(v)>0}
print(d2)
>>>>{'1': ['dog', 'mouse', 'horse'],
'3': ['cat', 'dog', 'mouse'],
'2': ['cat', 'mouse', 'horse'],
'4': ['cat', 'dog', 'horse'],}
Questo sembra funzionare, ma per i dizionari, le grandi 7000+ articoli, ci vogliono circa 20 secondi per lavorare attraverso. In sé e per sé, non è orribile, ma ho bisogno di farlo all'interno di un ciclo che eseguirà una iterazione di 10.000 volte, quindi al momento non è fattibile. Qualche suggerimento su come farlo rapidamente?
Nota a tutti: Lui sta usando Python 2.7 non 3 a causa di uso di 'itertitems', non lasciare che il' di stampa() 'ingannarti – jamylak
python 2.7 ha delle comprensioni? – Claudiu
@Claudiu Si è stato effettuato il backport – jamylak