2016-05-05 10 views
1

Ich habe diese Liste:Such einen Eintrag in einer Liste auf der Grundlage einen Teilstrings

item = ['AAA:60', 'BBB:10', 'CCC:65', 'DDD:70', 'EEE:70'] 

und dann bekomme ich diese Zeichenfolge an mich vorbei:

widget = 'BBB' 

Ich möchte das finden Eintrag in item basierend auf widget.

Ich möchte den Eintrag in der Liste finden, wenn widget in einem der Listeneinträge enthalten ist. Etwas, wo ich item[i] verwenden kann und die Liste für die Schleife erhalten bleibt.

Endgültige Ausgabe wäre der Listeneintrag selbst, BBB:10. (. In dem gegebenen Beispiel)

Antwort

3

Wenn Sie viele dieser Suche tun, bitte überprüfen Sie Ihr Design. Dies sollte ein Diktat sein, bei dem der Name des Widgets der Schlüssel ist und die Werte 60, 10, 65 usw. die Werte sind. Sie könnten dies aus Ihrer aktuellen Liste konstruieren mit

item_dict = dict((k,int(v)) for k,v in (i.rsplit(':') for i in item)) 

Dann könnten Sie leicht Werte Lookup mit:

item_dict['BBB'] # 10 (already converted to an int) 

in Betreiber jetzt tut vorhersehbar Test auf die Existenz:

'BBB' in item_dict # True 
'BB' in item_dict # False 
+0

So sollte es das OP machen. Danke für die Korrektur. Meine Antwort wurde um eine Antwort ergänzt. +1 – JRodDynamite

+0

@JRodDynamite - Tut mir leid, Mann, das funktioniert jetzt viel besser und ist sauberer, aber wie immer, danke für Ihre Hilfe. – chow

+0

@chow - Kein Problem Mann. Die Antwort verdient es. Freut mich, dass du es akzeptiert hast. Es wird anderen auch helfen. – JRodDynamite

4

können Sie versuchen:

>>> item = ['AAA:60', 'BBB:10', 'CCC:65', 'DDD:70', 'EEE:70'] 
>>> widget = 'BBB' 

>>> next(i for i in item if i.startswith(widget)) 
'BBB:10' 

Oder wenn es nicht notwendigerweise mit "BBB" beginnen müssen, dann können Sie den Zustand ändern zu

>>> next(i for i in item if widget in i) 
'BBB:10' 
>>> next(idx for idx,i in enumerate(item) if widget in i) 
1 

EDIT : Bitte lesen Sie auch @PaulMcGuire's answer. In puncto Design sollte es so gemacht werden.

+0

was mein Index dann zu Gegenstand []? Ich versuche, dies um ein 'IF' zu wickeln – chow

+0

@chow - Sie können einfach die Liste auflisten und holen Sie Ihr Ergebnis' next (idx für idx, ich in enumerate (Element) wenn Widget in i) '. – JRodDynamite

+0

Was ist, wenn Sie nach 'BB' suchen? Sie erhalten einen falschen Treffer auf "BBB: 10" entweder mit "startswith" oder "in" testen. Sicherer zu testen, wenn i.startswith (widget + ':') '. Dies setzt voraus, dass ':' nicht als Widget-ID gültig ist - wahrscheinlich eine sichere Annahme, wenn das Trennzeichen ':' in der Elementliste verwendet wird. – PaulMcG