Seite 1 von 1
Prüfen, ob einer von mehreren Schlüsseln in Dictionary
Verfasst: Donnerstag 17. April 2014, 11:26
von mutetella
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
Re: Prüfen, ob einer von mehreren Schlüsseln in Dictionary
Verfasst: Donnerstag 17. April 2014, 11:36
von cofi
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.
Re: Prüfen, ob einer von mehreren Schlüsseln in Dictionary
Verfasst: Donnerstag 17. April 2014, 11:57
von Sirius3
@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)
Re: Prüfen, ob einer von mehreren Schlüsseln in Dictionary
Verfasst: Donnerstag 17. April 2014, 12:22
von mutetella
@Sirius3
Jetzt wollte ich gerade klugscheißen, weil `isdisjoint()` doch kein Dictionary nimmt...

Aus der Doku geht das jetzt aber nicht wirklich hervor, oder weiß man das einfach?
mutetella
Re: Prüfen, ob einer von mehreren Schlüsseln in Dictionary
Verfasst: Donnerstag 17. April 2014, 12:28
von 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.
Re: Prüfen, ob einer von mehreren Schlüsseln in Dictionary
Verfasst: Donnerstag 17. April 2014, 13:01
von mutetella
@BlackJack
Ok, wenn man die Doku versteht, ist es nicht überraschend...

Was ist mit "non-operator versions" gemeint und warum ist ein Dictionary (auch) ein Iterable?
mutetella
Re: Prüfen, ob einer von mehreren Schlüsseln in Dictionary
Verfasst: Donnerstag 17. April 2014, 13:20
von 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?
Re: Prüfen, ob einer von mehreren Schlüsseln in Dictionary
Verfasst: Donnerstag 17. April 2014, 13:25
von snafu
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.