2 Stimmen

Python-Instanz aus Liste basierend auf Instanzvariable erhalten

Angenommen, Sie haben eine Liste von Instanzen, sagen wir clients. Ich versuche, ein Element aus der Liste anhand des Werts einer einzigen Instanzvariable screenName zu ziehen. Ich weiß, dass ich das tun kann:

for client in clients:
  if client.screenName = search:
    return client

Gibt es jedoch eine elegantere Möglichkeit, dies ohne die Schleife zu tun?

Vielen Dank für Ihre Hilfe :)

5voto

Praveen Gollakota Punkte 33644

Sie können filter verwenden

try:
    filter(lambda client: client.screenName == search, clients)[0]
except IndexError:
    # Fehler behandeln. Möglicherweise einen Standardwert verwenden

1voto

brandizzi Punkte 24822

Ich würde List Comprehensions verwenden. Nehmen wir an, dies ist Ihre Client-Klasse:

>>> class Client:
...    def __init__(self, screenName):
...        self.screenName = screenName

Wenn ich diese Liste von Clients habe:

>>> l = [Client('a'), Client('b'), Client('c')]

...kann ich eine Liste erhalten, die nur die Clients mit einem bestimmten Namen enthält:

>>> [e for e in l if e.screenName == 'b']
[<__main__.Client instance at 0x2e52b0>]

Jetzt einfach das erste - und vermutlich einzige - Element erhalten:

>>> [e for e in l if e.screenName == 'b'][0]
<__main__.Client instance at 0x2e52b0>
>>> c = [e for e in l if e.screenName == 'b'][0]
>>> c.screenName
'b'

Dies ist ziemlich kurz und meiner Meinung nach elegant, kann aber weniger effizient sein, da die List Comprehension über die gesamte Liste iteriert. Wenn Sie diesen Overhead vermeiden möchten, können Sie anstelle von eckigen Klammern anstelle von runden Klammern einen Generator erhalten:

>>> g = (e for e in l if e.screenName == 'b')
>>> g
 at 0x2e5440>
>>> g.next()
<__main__.Client instance at 0x2e52b0>

Beachten Sie jedoch, dass die next()-Methode nur einmal aufgerufen werden kann.

HTH!

1voto

unutbu Punkte 769083

Sie könnten einen Generator-Ausdruck verwenden,

client=next(client for client in clients if client.screenName == search)

aber beachten Sie, dass Sie immer noch eine Schleife haben, nur auf eine andere Weise.

Hinweis: Wenn kein Kunde die Bedingung client.screenName == search erfüllt, wirft das obige Beispiel eine StopIteration-Ausnahme aus. Dies unterscheidet sich von Ihrer for-Schleife, die aus der Schleife aussteigt, ohne etwas zurückzugeben.

Je nach Ihrer Situation ist es möglicherweise besser, eine Ausnahme auszulösen, anstatt still zu scheitern.

Wenn Sie keinen Standardwert anstelle einer StopIteration-Ausnahme möchten, können Sie die 2-Parameter-Version von next verwenden:

client=next(client for client in clients if client.screenName == search, 
            default_value)

0voto

Mike Ramirez Punkte 10362

Verwendung eines Wörterbuchs dafür:

Annehmen:

d[screeName] = client

Sie können einfach dies tun:

return d[search]

0voto

multipleinterfaces Punkte 8593

Wenn clients ein dict ist, können Sie einfach clients[search] verwenden. Wenn die Reihenfolge der Elemente in Ihrer Liste wichtig ist, können Sie ein OrderedDict aus collections verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X