Za použití ‚in‘, aby odpovídal atribut objektů Python v poli

hlasů
39

Nevzpomínám si, jestli se mi to zdá, nebo ne, ale já Zdá se, že tam připomenout, že je funkce, která dovolila něco podobného,

foo in iter_attr(array of python objects, attribute name)

Díval jsem se přes dokumenty, ale takové věci nespadá zjevných kótovaných záhlaví

Položena 03/08/2008 v 14:19
zdroj uživatelem
V jiných jazycích...                            


8 odpovědí

hlasů
38

Použití seznamu porozumění vybudují provizorní seznam, který by mohl sníst všechny své paměti v případě, že sekvence je vyhledávanou je velký. Iv případě, že sekvence není velký, vytváření seznamu znamená, že iterace po celé sekvence před inmohl začít svou vyhledávání.

Dočasný seznam může být vyhnout pomocí výraz generátor:

foo = 12
foo in (obj.id for obj in bar)

Nyní, jak dlouho obj.id == 12u startu bar, vyhledávání bude rychlá, i když barje nekonečně dlouhá.

Jako @Matt navrhl, že je to dobrý nápad použít hasattr, pokud některý z objektů barmůže být chybí idatribut:

foo = 12
foo in (obj.id for obj in bar if hasattr(obj, 'id'))
Odpovězeno 11/09/2008 v 23:42
zdroj uživatelem

hlasů
10

Hledáte způsob, jak získat seznam objektů, které mají určitou vlastnost? Pokud tomu tak je, je seznam s porozuměním je ten správný způsob, jak to udělat.

result = [obj for obj in listOfObjs if hasattr(obj, 'attributeName')]
Odpovězeno 03/08/2008 v 16:59
zdroj uživatelem

hlasů
8

můžete vždy psát vlastní kůži:

def iterattr(iterator, attributename):
    for obj in iterator:
        yield getattr(obj, attributename)

bude pracovat s něčím, že opakuje, ať už je to tuple, seznam, nebo cokoliv jiného.

Mám rád Python, to dělá věci, jako je to velmi jednoduché a nic víc zmatků než nutný, a při použití věci, jako je to velmi elegantní.

Odpovězeno 27/08/2008 v 21:13
zdroj uživatelem

hlasů
4

Funkce uvažujete o pravděpodobně operator.attrgettter. Chcete-li například získat seznam, který obsahuje hodnotu „id“ atribut každého objektu:

import operator
ids = map(operator.attrgetter("id"), bar)

Chcete-li zkontrolovat, zda seznam obsahuje objekt s id == 12, pak elegantní a efektivní (tedy nebude opakovat celý seznam zbytečně) způsob, jak to udělat, je:

any(obj.id == 12 for obj in bar)

Chcete-li používat ‚in‘ s attrgetter, zatímco ještě udrží líný iterace seznamu:

import operator,itertools
foo = 12
foo in itertools.imap(operator.attrgetter("id"), bar)

Odpovězeno 05/02/2011 v 09:10
zdroj uživatelem

hlasů
4

Ne, nebyli snění. Python má docela vynikající přehled porozuměním systém, který vám umožní manipulovat seznamy docela elegantně, a v závislosti na přesně to, co chcete dosáhnout, to lze provést několika způsoby. V podstatě to, co děláte, se říká: „Pro položku v seznamu, pokud criteria.matches“, a ze které můžete právě iterovat výsledků nebo výpis výsledků do nového seznamu.

Jdu betlém příklad z Dive Into Python tady, protože je to docela elegantní a jsou chytřejší než já. Zde se dostáváme seznam souborů v adresáři, pak filtrování seznamu pro všechny soubory, které odpovídají kritériím pravidelných výrazů.

    files = os.listdir(path)                               
    test = re.compile("test\.py$", re.IGNORECASE)          
    files = [f for f in files if test.search(f)]

Dalo by se to bez regulárních výrazů pro váš příklad, na cokoliv, kde se vaše vyjádření na konci vrátí hodnotu true na zápas. Existují i ​​jiné možnosti, jako je použití funkce filter (), ale když jsem šli volit, já bych šel s tím.

Eric Sipple

Odpovězeno 03/08/2008 v 15:30
zdroj uživatelem

hlasů
3

Pokud máte v plánu na hledání nic vzdáleně slušné velikosti, vaše nejlepší sázka bude používat slovník nebo sadu. V opačném případě jste v podstatě muset iterovat každý prvek iterátoru až se dostanete na ten, který chcete.

Pokud to není nezbytně výkon citlivé kód, pak je tento seznam s porozuměním, jak by měly fungovat. Ale všimněte si, že je to poměrně neefektivní, protože jde nad každým prvkem iterátoru a pak se vrátí nad ním znovu, dokud nenajde to, co chce.

Pamatovat, python má jeden z nejúčinnějších šifrovací algoritmy, které existují. Použijte jej ke svému prospěchu.

Odpovězeno 27/08/2008 v 21:30
zdroj uživatelem

hlasů
3

To, co jsem měl na mysli může být dosaženo použitím list comprehension, ale myslel jsem si, že tam byla funkci, která to udělala v poněkud stručnější způsobem.

IE ‚bar‘ je uveden seznam předmětů, z nichž všechny mají atribut ‚id‘

Mýtický funkční způsobem:

foo = 12
foo in iter_attr(bar, 'id')

Seznam porozumění způsobem:

foo = 12
foo in [obj.id for obj in bar]

Při zpětném pohledu se seznam s porozuměním, jak je vlastně docela hezké.

Odpovězeno 03/08/2008 v 17:13
zdroj uživatelem

hlasů
-1

Myslím:

#!/bin/python
bar in dict(Foo)

Je to, co jste na mysli. Když se snaží zjistit, zda určitý klíč existuje ve slovníku v pythonu (verze Pythonu z tabulky hash), existují dva způsoby, jak zjistit. První z nich je has_key()metoda připojena do slovníku a druhý je příklad uvedený výše. Vrátí logickou hodnotu.

To by mělo odpovědět na vaši otázku.

A teď trochu mimo téma k tie to se do seznamu s porozuměním odpověď předem dané (pro trochu více jasnosti). Seznam comprehension sestavit seznam ze základního na smyčku s modifikátory. Jako příklad lze uvést (mírně vyjasnit), což je způsob, jak používat in dictjazyk konstruktu v seznamu s porozuměním :

Řekněme, že máte dvourozměrný slovníku fooa chcete jen druhý rozměr slovníky, které obsahují klíč bar. Relativně jednoduchý způsob jak to udělat, by bylo použít seznam s porozuměním s podmíněným takto:

#!/bin/python
baz = dict([(key, value) for key, value in foo if bar in value])

Na vědomí, že if bar in valuena konci příkazu **, to je klauzule modifikující který řekne seznamu porozumění , aby pouze ty páry klíč-hodnota, které splňují podmíněné. ** V tomto případě bazje nový slovník, který obsahuje pouze slovníky z foo které obsahují bar (Doufám, že nic v tomto příkladu kódu chybí ... budete muset nahlédnout do dokumentace seznam chápání nalezené v docs.python.org konzultace a na secnetix.de , obě místa jsou dobré reference, pokud máte otázky v budoucnosti.).

Odpovězeno 03/08/2008 v 16:47
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more