Ich bin ein C-Codierer, der etwas in Python entwickelt. Ich weiß, wie man das Folgende in C macht (und daher in der C-ähnlichen Logik, die auf Python angewendet wird), aber ich frage mich, wie Python das macht.
Ich habe ein Wörterbuch d und möchte eine Teilmenge der Elemente bearbeiten. Nur diejenigen, deren Schlüssel (Zeichenfolge) eine bestimmte Teilzeichenfolge enthält.
dh die C-Logik wäre:
for key in d:
if filter_string in key:
# do something
else
# do nothing, continue
Ich stelle mir vor, die Python-Version wäre so etwas wie
filtered_dict = crazy_python_syntax(d, substring)
for key,value in filtered_dict.iteritems():
# do something
Ich habe hier viele Beiträge zum Filtern von Wörterbüchern gefunden, konnte aber keinen finden, der genau dies beinhaltet.
Mein Wörterbuch ist nicht verschachtelt und ich verwende Python 2.7
Antworten:
Wie wäre es mit einem Diktatverständnis :
Wenn Sie es sehen, sollte es selbsterklärend sein, da es sich ziemlich gut wie Englisch liest.
Diese Syntax erfordert Python 2.7 oder höher.
In Python 3 gibt es nur
dict.items()
, nichtiteritems()
so , dass Sie verwenden würden:quelle
filtered_dict = {k:d[k] for k in d if filter_string in k}
?d[k]
Suche nicht erfolgt.# do something
in den Kommentaren, aber wir lassen hier ein paar Schlüssel fallen.iteritems
in Python 3? Das glaube ich nicht. Also wäre meine Version kompatibel, nein?iteritems
mititems
, die die gleiche wie Python 2.7 ist istiteritems
.Entscheiden Sie sich für das, was am besten lesbar und leicht zu warten ist. Nur weil Sie es in einer einzigen Zeile schreiben können, heißt das nicht, dass Sie es sollten. Ihre vorhandene Lösung entspricht in etwa dem, was ich verwenden würde, außer dass ich Benutzeriteritems zum Überspringen der Wertsuche verwenden würde, und ich hasse verschachtelte Wenns, wenn ich sie vermeiden kann:
Wenn Sie jedoch wirklich möchten, dass etwas Sie durch ein gefiltertes Diktat iterieren lässt, würde ich nicht den zweistufigen Prozess ausführen, bei dem das gefilterte Diktat erstellt und dann durchlaufen wird, sondern stattdessen einen Generator verwenden, denn was ist pythonischer (und fantastischer) als ein Generator?
Zuerst erstellen wir unseren Generator, und gutes Design schreibt vor, dass wir ihn abstrakt genug machen, um wiederverwendbar zu sein:
Und dann können wir den Generator verwenden, um Ihr Problem mit einfachem, verständlichem Code schön und sauber zu lösen:
Kurzum: Generatoren sind fantastisch.
quelle
Sie können die eingebaute in verwenden Filterfunktion zum Filter Wörterbücher, Listen, usw. basierend auf bestimmten Bedingungen.
Der Vorteil ist, dass Sie es für verschiedene Datenstrukturen verwenden können.
quelle
items:
diesitem:
in der Lambda-Definition enthalten sein sollte.quelle
iteritems()
wird effizienter sein alsitems()
.items()
solche, die sich wie Python 2.7 verhalteniteritems
.Jonathon gab Ihnen einen Ansatz mit Diktatverständnis in seiner Antwort . Hier ist ein Ansatz, der sich mit Ihrer Aufgabe befasst .
Wenn Sie etwas mit den Werten des Wörterbuchs tun möchten, benötigen Sie überhaupt kein Wörterbuchverständnis:
Ich benutze
iteritems(
), seit du deine Frage mit getaggt hastPython-2.7Das Ergebnis befindet sich nun in einer Liste,
some_function
die auf jedes Schlüssel / Wert-Paar des Wörterbuchs angewendet wird, dasfoo
seinen Schlüssel enthält.Wenn Sie nur mit den Werten umgehen und die Schlüssel ignorieren möchten, ändern Sie einfach das Listenverständnis:
some_function
kann beliebig aufrufbar sein, also würde auch ein Lambda funktionieren:Die innere Liste ist eigentlich nicht erforderlich, da Sie einen Generatorausdruck auch an map übergeben können:
quelle
map(lambda a: a[0]*a[1], ((k,v) for k,v in {2:2, 3:2}.iteritems() if k == 2))
- das wird dir geben[4]
.map
ist ein Listenverständnis.[f(v) for k, v in d.iteritems() if substring in k]
Ich denke, es ist viel lesbarer und effizienter.results = list(starmap(...))
oderfor result in starmap(...): ...
).