it-swarm.com.de

Filterelemente in einem python Wörterbuch, in dem Schlüssel eine bestimmte Zeichenfolge enthalten

Ich bin ein C-Programmierer, der etwas in Python entwickelt. Ich weiß, wie man das Folgende in C macht (und daher in C-ähnlicher Logik, die auf Python angewendet wird), aber ich frage mich, wie Python das macht.

Ich habe ein Wörterbuch d, und ich möchte eine Teilmenge der Elemente bearbeiten, nur diejenigen, deren Schlüssel (Zeichenfolge) eine bestimmte Teilzeichenfolge enthält.

d.h. die C-Logik wäre:

for key in d:
    if filter_string in key:
        # do something
    else
        # do nothing, continue

Ich stelle mir die python version so ähnlich vor

filtered_dict = crazy_python_syntax(d, substring)
for key,value in filtered_dict.iteritems():
    # do something

Ich habe hier eine Menge Posts zum Filtern von Wörterbüchern gefunden, konnte aber keine finden, die genau dies betraf.

Mein Wörterbuch ist nicht verschachtelt und ich verwende python 2.7

76
memo

Wie wäre es mit einem diktieren Verständnis :

filtered_dict = {k:v for k,v in d.iteritems() if filter_string in k}

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() , nicht iteritems(), also würden Sie Folgendes verwenden:

filtered_dict = {k:v for (k,v) in d.items() if filter_string in k}
151

Entscheiden Sie sich für das, was am besten lesbar und leicht zu warten ist. Nur weil Sie es in einer einzigen Zeile ausschreiben können, heißt das noch lange nicht, dass Sie es sollten. Ihre vorhandene Lösung entspricht in etwa dem, was ich verwenden würde, als dass ich Benutzer-Iteritems zum Überspringen der Wertsuche verwenden würde, und ich hasse geschachtelte ifs, wenn ich sie vermeiden kann:

for key, val in d.iteritems():
    if filter_string not in key:
        continue
    # do something

Wenn Sie jedoch wirklich möchten, dass Sie ein gefiltertes Diktat durchlaufen, würde ich nicht in zwei Schritten das gefilterte Diktat erstellen und dann durchlaufen, sondern 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 ihn wiederverwendbar zu machen:

# The implementation of my generator may look vaguely familiar, no?
def filter_dict(d, filter_string):
    for key, val in d.iteritems():
        if filter_string not in key:
            continue
        yield key, val

Und dann können wir den Generator verwenden, um Ihr Problem zu lösen. Schön und sauber mit einfachem, verständlichem Code:

for key, val in filter_dict(d, some_string):
    # do something

Kurz gesagt: Generatoren sind fantastisch.

15
Brendan F
input = {"A":"a", "B":"b", "C":"c"}
output = {k:v for (k,v) in input.items() if key_satifies_condition(k)}
8
jspurim

Jonathon gab Ihnen einen Ansatz mit Diktatverständnissen in seine Antwort . Hier ist ein Ansatz, der sich mit Ihrer Aufgabe befasst .

Wenn Sie etwas mit den Werten des Wörterbuchs anfangen möchten, benötigen Sie überhaupt kein Wörterbuchverständnis:

Ich benutze iteritems() da du deine Frage mit python-2.7 markiert hast

results = map(some_function, [(k,v) for k,v in a_dict.iteritems() if 'foo' in k])

Nun wird das Ergebnis in einer Liste mit some_function wird auf jedes Schlüssel/Wert-Paar des Wörterbuchs angewendet, dessen Schlüssel foo enthält.

Wenn Sie sich nur mit den Werten befassen und die Schlüssel ignorieren möchten, ändern Sie einfach das Listenverständnis:

results = map(some_function, [v for k,v in a_dict.iteritems() if 'foo' in k])

some_function kann ein beliebiger Aufrufer sein, daher würde auch ein Lambda funktionieren:

results = map(lambda x: x*2, [v for k,v in a_dict.iteritems() if 'foo' in k])

Die innere Liste ist eigentlich nicht erforderlich, da Sie einen Generatorausdruck auch an map übergeben können:

>>> map(lambda a: a[0]*a[1], ((k,v) for k,v in {2:2, 3:2}.iteritems() if k == 2))
[4]
7
Burhan Khalid

Sie können die integrierte Filterfunktion verwenden, um Wörterbücher, Listen usw. basierend auf bestimmten Bedingungen zu filtern.

filtered_dict = dict(filter(lambda item: filter_str in item[0], d.items()))

Der Vorteil ist, dass Sie es für verschiedene Datenstrukturen verwenden können.

6
Pulkit