Vra

Ek kan nie onthou of ek gedroom het of nie, maar dit lyk asof ek onthou dat daar 'n funksie was wat iets toegelaat het soos,

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

Ek het na die dokumente gekyk, maar hierdie soort ding val nie onder enige ooglopende gelyste opskrifte nie

Was dit nuttig?

Oplossing

Die gebruik van 'n lysbegrip sal 'n tydelike lys bou, wat al jou geheue kan eet as die volgorde wat gesoek word groot is.Selfs as die reeks nie groot is nie, beteken die bou van die lys om oor die hele reeks te herhaal in sy soektog kon begin.

Die tydelike lys kan vermy word deur 'n generator uitdrukking te gebruik:

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

Nou, solank obj.id == 12 naby die begin van bar, sal die soektog vinnig wees, selfs al bar is oneindig lank.

Soos @Matt voorgestel het, is dit 'n goeie idee om te gebruik hasattr indien enige van die voorwerpe in bar kan ontbreek 'n id kenmerk:

foo = 12
foo in (obj.id for obj in bar if hasattr(obj, 'id'))

Ander wenke

Is jy op soek na 'n lys van voorwerpe wat 'n sekere eienskap het?Indien wel, a lys begrip is die regte manier om dit te doen.

result = [obj for obj in listOfObjs if hasattr(obj, 'attributeName')]

jy kan altyd self een skryf:

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

sal werk met enigiets wat herhaal, of dit nou 'n tupel, lys of wat ook al is.

Ek is mal oor luislang, dit maak dinge soos hierdie baie eenvoudig en nie meer moeite as wat nodig is nie, en in gebruik is dinge soos hierdie uiters elegant.

Nee, jy het nie gedroom nie.Python het 'n redelik uitstekende lysbegripstelsel waarmee u lyste redelik elegant kan manipuleer, en afhangende van presies wat u wil bereik, kan dit op 'n paar maniere gedoen word.In wese, wat jy doen is om te sê "Vir item in lys as criteria.matches", en daaruit kan jy net deur die resultate herhaal of die resultate in 'n nuwe lys gooi.

Ek gaan 'n voorbeeld van krip Duik in Python hier, want dit is redelik elegant en hulle is slimmer as ek.Hier kry hulle 'n lys van lêers in 'n gids, en filter dan die lys vir alle lêers wat ooreenstem met 'n gereelde uitdrukking-kriteria.

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

Jy kan dit doen sonder gereelde uitdrukkings, vir jou voorbeeld, vir enigiets waar jou uitdrukking aan die einde waar is vir 'n passing.Daar is ander opsies soos om die filter() funksie te gebruik, maar as ek sou kies, sou ek hiermee gaan.

Eric Sippel

Die funksie waaraan jy dink is waarskynlik operator.attrgettter.Byvoorbeeld, om 'n lys te kry wat die waarde van elke voorwerp se "id"-kenmerk bevat:

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

As jy wil kyk of die lys 'n voorwerp met 'n id == 12 bevat, dan 'n netjiese en doeltreffende (d.w.s.herhaal nie die hele lys onnodig nie) manier om dit te doen is:

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

As jy 'in' met attrgetter wil gebruik, terwyl jy steeds lui herhaling van die lys behou:

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

Waaraan ek gedink het, kan bereik word deur lysbegrip te gebruik, maar ek het gedink daar is 'n funksie wat dit op 'n effens netjieser manier gedoen het.

d.w.s.'balk' is 'n lys van voorwerpe, wat almal die kenmerk 'id' het

Die mitiese funksionele manier:

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

Die manier om lys te verstaan:

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

In retrospek is die lysbegrip in elk geval redelik netjies.

As jy van plan is om enigiets van redelike grootte te soek, sal jou beste opsie wees om 'n woordeboek of 'n stel te gebruik.Andersins moet jy basies deur elke element van die iterator herhaal totdat jy by die een kom wat jy wil hê.

As dit nie noodwendig prestasie-sensitiewe kode is nie, behoort die lysbegrip manier te werk.Maar let op dat dit redelik ondoeltreffend is, want dit gaan oor elke element van die iterator en gaan dan weer TERUG daaroor totdat dit vind wat dit wil hê.

Onthou, python het een van die doeltreffendste hashing-algoritmes.Gebruik dit tot jou voordeel.

Ek dink:

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

Is waaraan jy dink.Wanneer jy probeer kyk of 'n sekere sleutel in 'n woordeboek in python (python se weergawe van 'n hash-tabel) bestaan, is daar twee maniere om na te gaan.Eerste is die has_key() metode aangeheg aan die woordeboek en tweede is die voorbeeld hierbo gegee.Dit sal 'n Boolese waarde gee.

Dit behoort jou vraag te beantwoord.

En nou 'n bietjie van die onderwerp af om dit aan die lys begrip antwoord wat voorheen gegee is (vir 'n bietjie meer duidelikheid). Lys Begrippe maak 'n lys van 'n basiese vir lus met wysigers.As 'n voorbeeld (om effens te verduidelik), 'n manier om die in dict taalkonstruksie in a lys begrip:

Gestel jy het 'n tweedimensionele woordeboek foo en jy wil net die tweede dimensie woordeboeke hê wat die sleutel bevat bar.'n Relatief eenvoudige manier om dit te doen, sou wees om a lys begrip met 'n voorwaarde soos volg:

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

Let op die if bar in value aan die einde van die stelling** is dit 'n wysigingsklousule wat die lys begrip om slegs daardie sleutel-waarde-pare te hou wat aan die voorwaarde voldoen.** In hierdie geval baz is 'n nuwe woordeboek wat slegs die woordeboeke van foo bevat wat bar bevat (hopelik het ek niks in daardie kodevoorbeeld gemis nie...jy sal dalk moet kyk na die lysbegripdokumentasie wat in gevind word docs.python.org tutoriale en by secnetix.de, beide werwe is goeie verwysings as jy in die toekoms vrae het.).

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top