Használata „a” megfelelő attribútum Python objektumok egy tömbben

szavazat
39

Nem emlékszem, hogy álmodtam, vagy sem, de ha jól emlékszem ott a függvénye, amely lehetővé tette valami hasonló,

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

Már néztem át a docs, de ez a fajta dolog nem tartozik semmilyen nyilvánvaló felsorolt ​​fejlécek

A kérdést 03/08/2008 14:19
a forrás felhasználó
Más nyelveken...                            


8 válasz

szavazat
4

Nem, nem álmodik. Python egy elég jó lista megértés rendszer, amely lehetővé teszi, hogy manipulálják listák elég elegánsan, és attól függően, hogy pontosan mit szeretne elérni, ezt lehet tenni egy pár módon. Lényegében mit csinálsz azt mondja: „A tétel listán, ha criteria.matches”, és hogy ha csak végighaladni az eredményeket vagy lerakó az eredményeket egy új listát.

Megyek gyermekágy egy példát a Dive Into Python ide, mert elég elegáns és ők okosabbak, mint én. Itt a sorstól egy listát a fájlokat egy könyvtárban, majd szűrjük a lista megfelelő összes fájl egy reguláris kifejezés kritériumoknak.

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

Ehhez valójában nem reguláris kifejezések, a például semmit, ahol a kifejezést a végén visszatér igaz a mérkőzés. Vannak más lehetőségek, mint a szűrő () függvény, de ha én fogja választani, megyek ezzel.

Eric Sipple

Válaszolt 03/08/2008 15:30
a forrás felhasználó

szavazat
-1

Gondolom:

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

Az, amit gondol. Amikor megpróbál, hogy ha egy bizonyos kulcs létezik egy szótárt (Python változata a hash tábla) kétféle módon ellenőrizni. Először a has_key()módszer csatolt a szótárban, és második a fenti példával. Vissza fog térni egy logikai érték.

Hogy kell válaszolni a kérdésre.

És most egy kicsit off topic kötni ezt a listát megértés válasz korábban megadott (egy kicsit egyértelműség). List Comprehensions össze egy listát az alap hurok a módosítók. Példaként (tisztázására kissé), oly módon, hogy használja a in dictnyelvi konstrukció egy lista megértés :

Tegyük fel, hogy van egy kétdimenziós szótár fooés csak szeretné, hogy a második dimenzió szótárak, amelyek a legfontosabb bar. Egy viszonylag egyszerű módja ennek az lenne, hogy egy listát a megértés egy feltételes az alábbiak szerint:

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

Megjegyzés: a if bar in valuevégén a nyilatkozat **, ez egy módosító záradékot, amely jelzi a lista megértés csak tartani azokat kulcsértékpárokat, amelyek megfelelnek a feltételes. ** Ebben az esetben bazegy új szótárt, amely csak a szótárak ize amelyek bár (Remélem nem hiányzik semmi, hogy kódpéldát ... akkor lehet, hogy megnézzük a listát megértés dokumentáció megtalálható docs.python.org útmutatók és secnetix.de , mind oldalak jó referenciák, ha kérdése van a jövőben.).

Válaszolt 03/08/2008 16:47
a forrás felhasználó

szavazat
10

Keres, hogy egy objektumok listáját, amelyek egy bizonyos tulajdonság? Ha igen, a lista a megértés a helyes módja ennek.

result = [obj for obj in listOfObjs if hasattr(obj, 'attributeName')]
Válaszolt 03/08/2008 16:59
a forrás felhasználó

szavazat
3

Amit gondoltam érhető el lista comprehensions, de azt hittem, hogy van olyan funkció, amely ezt tette egy kicsit tisztább módon.

azaz a „bar” objektumok listáját, amelyek mindegyike az attribútum „id”

A mitikus funkcionális módon:

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

A lista megértés módja:

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

Visszatekintve a listán megértés módja elég ügyes egyébként.

Válaszolt 03/08/2008 17:13
a forrás felhasználó

szavazat
8

akkor is mindig írj egyet magadnak:

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

együtt fog működni minden, ami végigmegy, legyen az egy tuple, lista, vagy bármi más.

Szeretem python, ez teszi dolgok, mint ez nagyon egyszerű, és nem több a gond, mint Szükséges és használatban dolgok, mint ez is rendkívül elegáns.

Válaszolt 27/08/2008 21:13
a forrás felhasználó

szavazat
3

Ha a terv keres semmit távolról tisztességes méretű, a legjobb megoldás az lesz, hogy egy szótár vagy egy sor. Ellenkező esetben, ha alapvetően meg kell végighaladni minden eleme a bejáró, amíg eljut a kívánt.

Ha ez nem feltétlenül a teljesítmény és nagybetűk kódot, akkor a lista megértés módon kell működnie. De megjegyezzük, hogy ez meglehetősen hatástalan, mert megy át minden eleme a bejáró majd visszamegy át újra, amíg nem talál, amit akar.

Ne felejtsük el, python az egyik leghatékonyabb darabolási algoritmus körül. Használd az előnyt.

Válaszolt 27/08/2008 21:30
a forrás felhasználó

szavazat
38

Egy lista megértés épít egy ideiglenes listát, ami enni a memóriát, ha a sorozat keresett nagy. Még ha a sorrend nem nagy, az épület a lista azt jelenti iterációjával az egész szekvencia előtt inindulhasson a keresést.

Az ideiglenes lista lehet, elkerülve az egy generátor segítségével ki:

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

Most, amíg obj.id == 12közelében kezdetét bar, a keresés gyors lesz, akkor is, ha barvégtelen hosszú.

Ahogy @Matt javasolta, hogy ez egy jó ötlet, hogy hasattrha bármely tárgyakat barlehet hiányzik egy idattribútum:

foo = 12
foo in (obj.id for obj in bar if hasattr(obj, 'id'))
Válaszolt 11/09/2008 23:42
a forrás felhasználó

szavazat
4

A funkció gondol talán operator.attrgettter. Például, ha kap egy listát, amely tartalmazza az érték az egyes objektum „id” attribútummal:

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

Ha azt szeretnénk, hogy ellenőrizze, hogy a lista tartalmaz egy objektumot egy id == 12, majd egy ügyes és hatékony (azaz nem léptetjük a teljes lista feleslegesen) módja van:

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

Ha a használni kívánt „a” a attrgetter, miközben megőrzik lusta iteráció a lista:

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

Válaszolt 05/02/2011 09:10
a forrás felhasználó

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