Prüfen, ob einer von mehreren Schlüsseln in Dictionary

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Hallo,

ich setze ein flag folgendermaßen:

Code: Alles auswählen

has_date = bool(
    filter(lambda k: k in result,
    ('year', 'years', 'month', 'months', 'day', 'days',
     'weekday', 'weekdays'))
)
Nachdem mich `pylint` darauf hinweist, dass "map/filter on lambda could be replaced by comprehension" bin ich mir unsicher, ob ich could be in diesem Fall beachten sollte.

Code: Alles auswählen

has_date = bool(
    [name for name in
     ('year', 'years', 'month', 'months', 'day', 'days',
     'weekday', 'weekdays') if name in result]
)
Egal? Oder gibt es noch was anderes?

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Falls du es ersetzt solltest du `any` und eine Generator Expression benutzen ;)

Ich bin mir allerdings auch nicht komplett sicher, ob die nicht `filter` Variante zu bevorzugen ist.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@mutetella: any ist hier der passende Weg:

Code: Alles auswählen

has_date = any(name in result
    for name in ('year', 'years', 'month', 'months', 'day', 'days',
     'weekday', 'weekdays')
)
oder über sets:

Code: Alles auswählen

has_date = not set([('year', 'years', 'month', 'months', 'day', 'days',
     'weekday', 'weekdays']).isdisjoint(result)
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@Sirius3
Jetzt wollte ich gerade klugscheißen, weil `isdisjoint()` doch kein Dictionary nimmt... :roll: Aus der Doku geht das jetzt aber nicht wirklich hervor, oder weiß man das einfach?

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
BlackJack

@mutetella: `isdisjoint()` nimmt jedes beliebige iterierbare Objekt. Um mal die Dokumentation zu zitieren:
Note, the non-operator versions of union(), intersection(), difference(), and symmetric_difference(), issubset(), and issuperset() methods will accept any iterable as an argument. In contrast, their operator based counterparts require their arguments to be sets. This precludes error-prone constructions like set('abc') & 'cbs' in favor of the more readable set('abc').intersection('cbs').
Edit: `isdisjoint()` wird da jetzt nicht erwähnt, also muss man sich das an der Stelle denken. Wirklich überraschend finde ich das jetzt aber nicht.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@BlackJack
Ok, wenn man die Doku versteht, ist es nicht überraschend... :wink: Was ist mit "non-operator versions" gemeint und warum ist ein Dictionary (auch) ein Iterable?

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
BlackJack

@mutetella: Die in dem Absatz erwähnten Operationen gibt es sowohl als Methoden als auch als Operatoren, und „non-operator versions” meint dann die Methoden.

Warum Wörterbücher iterierbar sind musst Du Guido fragen, aber das sie es sind, sollte man eigentlich wissen. Ich nehme mal an weil alle anderen Container-Objekte auch iterierbar sind. Hast Du noch nie ``for key in dictionary:`` geschrieben oder zumindest mal gesehen?
Benutzeravatar
snafu
User
Beiträge: 6736
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Mich würde wundern, wenn Wörterbücher *nicht* iterierbar sind. Schließlich stellen die ja einen Container-Typ dar. Nur dass diese Art von Container - genau wie Sets - eben keine Garantien zur Reihenfolge ihrer Objekte macht.
Antworten