Überprüfen Sie, ob ein Python-Listenelement eine Zeichenfolge in einer anderen Zeichenfolge enthält


587

Ich habe eine Liste:

my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']

und möchten nach Elementen suchen, die die Zeichenfolge enthalten 'abc'. Wie kann ich das machen?

if 'abc' in my_list:

würde prüfen, ob 'abc'in der Liste vorhanden ist, aber es ist ein Teil von 'abc-123'und 'abc-456', 'abc'existiert nicht für sich. Wie kann ich also alle Artikel erhalten, die enthalten 'abc'?


19
Um das Gegenteil zu überprüfen (wenn eine Zeichenfolge eine unter mehreren Zeichenfolgen enthält): stackoverflow.com/a/6531704/2436175
Antonio

Wenn die linken Teile von Einträgen eindeutig sind, sollten Sie ein Diktat aus der Liste erstellen: Suchen Sie einen Eintrag in einer Liste basierend auf einer Teilzeichenfolge
Georgy

Antworten:


930

Wenn Sie nur prüfen möchten, ob abceine Zeichenfolge in der Liste vorhanden ist, können Sie es versuchen

some_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
if any("abc" in s for s in some_list):
    # whatever

Wenn Sie wirklich alle die Elemente enthält , erhalten möchten abc, verwenden Sie

matching = [s for s in some_list if "abc" in s]

Ich muss überprüfen, ob sich ein Element in einem Array von 6 Elementen befindet. Ist es schneller 6 "wenn" zu machen oder ist es das gleiche?
Olivier Pons

42
@OlivierPons, einfach tunif myitem in myarray:
alldayremix

8
Ein anderer Weg, um alle Strings zu bekommen, die den Teilstring 'abc' enthalten:filter(lambda element: 'abc' in element, some_list)
Driftcatcher

2
@ p014k: Verwenden Sie die index()Methode:try: return mylist.index(myitem); except ValueError: pass
Sven Marnach

1
@midkin: Ich verstehe weder, was genau du versucht hast, noch wie es schief gelaufen ist. Sie werden wahrscheinlich mehr Glück haben, wenn Sie eine neue Frage stellen (mit der Schaltfläche "Frage stellen"), Ihren genauen Code kopieren, was Sie von dem Code erwartet hätten und was er tatsächlich getan hat. "Hat nicht funktioniert" ist völlig bedeutungslos, es sei denn, Sie definieren, was "funktioniert" in diesem Zusammenhang bedeutet, aber selbst dann ist es besser zu erklären, was tatsächlich passiert ist, als zu sagen, was nicht.
Sven Marnach

104

Werfen Sie einfach das da draußen: Wenn Sie nach Bedarf geschehen gegen mehr als eine Zeichenkette zu passen, zum Beispiel abcund def, Sie zwei Comprehensions kombinieren können wie folgt dar :

matchers = ['abc','def']
matching = [s for s in my_list if any(xs in s for xs in matchers)]

Ausgabe:

['abc-123', 'def-456', 'abc-456']

4
Genau dafür habe ich gegoogelt. Danke!
N8TRO

2
Sie können auch verwenden {s for s in my_list for xs in matchers if xs in s}(beachten Sie die geschweiften Klammern, um ein eindeutiges Set zu erstellen). Könnte leichter zu lesen sein, könnte aber langsamer sein, wenn die meisten sWerte übereinstimmen, da Sie anybeim ersten Spiel effizient anhalten.
Matthias Fripp

82

Verwenden Sie filter, um zu den Elementen zu gelangen, die haben abc.

>>> lst = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
>>> print filter(lambda x: 'abc' in x, lst)
['abc-123', 'abc-456']

Sie können auch ein Listenverständnis verwenden.

>>> [x for x in lst if 'abc' in x]

Verwenden Sie das Wort übrigens nicht listals Variablennamen, da es bereits für den listTyp verwendet wird.


50

Wenn Sie nur wissen müssen, ob 'abc' in einem der Elemente enthalten ist, ist dies der kürzeste Weg:

if 'abc' in str(my_list):

1
Dies würde fehlschlagen, wenn Sie eine Liste von ["abc1", "1abc2"] hätten, da eine Übereinstimmung gefunden würde, da die Zeichenfolge 'abc' in der neu erstellten Zeichenfolge enthalten wäre
cgseller

2
Ja, dies ist das beabsichtigte Verhalten ... wahr, wenn eines der Elemente 'abc' enthält
RogerS

7
Ich weiß nicht, warum all diese anderen Leute sich für diese verschlungenen Lambda-Lösungen entscheiden, wenn sie es nicht brauchen! Gute Arbeit @RogerS
ntk4

1
Eigentlich beantwortet sich die gleiche Frage fast von selbst ... Ich habe gerade 3 Buchstaben hinzugefügt.
RogerS

1
Es ist eine gute Lösung, aber wenn Sie die Elemente finden möchten, die die angegebene Zeichenfolge enthalten, werden Sie keinen Erfolg haben. Hier können Sie herausfinden, ob jeder der Gegenstände die Zeichenfolge enthält.
Cslotty

18

Dies ist eine ziemlich alte Frage, aber ich biete diese Antwort an, da die vorherigen Antworten keine Elemente in der Liste enthalten, die keine Zeichenfolgen (oder eine Art iterierbares Objekt) sind. Solche Elemente würden dazu führen, dass das gesamte Listenverständnis mit einer Ausnahme fehlschlägt.

Verwenden Sie Folgendes, um mit solchen Elementen in der Liste ordnungsgemäß umzugehen, indem Sie die nicht iterierbaren Elemente überspringen:

[el for el in lst if isinstance(el, collections.Iterable) and (st in el)]

dann mit einer solchen Liste:

lst = [None, 'abc-123', 'def-456', 'ghi-789', 'abc-456', 123]
st = 'abc'

Sie erhalten weiterhin die passenden Artikel ( ['abc-123', 'abc-456'])

Der Test für iterable ist möglicherweise nicht der beste. Habe es von hier bekommen: Wie bestimme ich in Python, ob ein Objekt iterierbar ist?


Wäre [el for el in lst if el and (st in el)]das gegebene Beispiel nicht sinnvoller?
Gordo

@tinix Ich weiß nicht, dass nicht iterierbare Objekte elegant behandelt werden, oder?
Robert Muil

"gegebenes Beispiel" my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456'] keine Notwendigkeit, es zu komplizieren.
Gordo

1
Ja, absolut - die akzeptierte Antwort ist perfekt geeignet und mein Vorschlag ist komplizierter. Sie können ihn also gerne ignorieren. Ich habe nur angeboten, falls jemand das gleiche Problem hatte wie ich: Nicht iterierbare Elemente in solchen Listen sind eine reale Möglichkeit obwohl im gegebenen Beispiel nicht vorhanden.
Robert Muil

13
x = 'aaa'
L = ['aaa-12', 'bbbaaa', 'cccaa']
res = [y for y in L if x in y]

10
for item in my_list:
    if item.find("abc") != -1:
        print item

3
Wenn Sie diesen Ansatz wählen, ist es meiner Meinung nach idiomatischer, ihn if 'abc' in itemeher zu verwenden item.find('abc') == -1.
Wyatt Baldwin


4

Verwenden Sie die __contains__()Methode der Pythons-Zeichenfolgenklasse:

a = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
for i in a:
    if i.__contains__("abc") :
        print(i, " is containing")

3

Ich bin neu in Python. Ich habe den folgenden Code zum Laufen gebracht und es leicht verständlich gemacht:

my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
for str in my_list:
    if 'abc' in str:
       print(str)

0
my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']

for item in my_list:
    if (item.find('abc')) != -1:
        print ('Found at ', item)

0
mylist=['abc','def','ghi','abc']

pattern=re.compile(r'abc') 

pattern.findall(mylist)

In Python3.6 gibt dies einen Fehler: TypeError: erwartete Zeichenfolge oder
byteähnliches

1
@AimForClarity Ja. re.findall in python3.6 erwartet eine Zeichenfolge. Eine Alternative wäre, die Liste in einen String import re mylist=['abc','def','ghi','abcff'] my_list_string=''.join(mylist) string_to_find="abc" res=re.findall(string_to_find,my_list_string) print(res)
umzuwandeln

1
Entschuldigung für die schlechte Formatierung. Konnte aus irgendeinem Grund keine richtigen Zeilenumbrüche ausführen.
Arun_Munagala

0

Ich habe eine Suche durchgeführt, bei der Sie einen bestimmten Wert eingeben müssen. Dann wird nach einem Wert aus der Liste gesucht, die Ihre Eingabe enthält:

my_list = ['abc-123',
        'def-456',
        'ghi-789',
        'abc-456'
        ]

imp = raw_input('Search item: ')

for items in my_list:
    val = items
    if any(imp in val for items in my_list):
        print(items)

Versuchen Sie, nach 'abc' zu suchen.


0
def find_dog(new_ls):
    splt = new_ls.split()
    if 'dog' in splt:
        print("True")
    else:
        print('False')


find_dog("Is there a dog here?")

0

Ich brauchte die Listenindizes , die einer Übereinstimmung entsprechen, wie folgt:

lst=['abc-123', 'def-456', 'ghi-789', 'abc-456']

[n for n, x in enumerate(lst) if 'abc' in x]

Ausgabe

[0, 3]

-1

Frage: Geben Sie die Informationen von abc

    a = ['abc-123', 'def-456', 'ghi-789', 'abc-456']


    aa = [ string for string in a if  "abc" in string]
    print(aa)

Output =>  ['abc-123', 'abc-456']

-2

Meines Wissens wird eine 'for'-Anweisung immer Zeit in Anspruch nehmen.

Wenn die Listenlänge zunimmt, nimmt auch die Ausführungszeit zu.

Ich denke, dass das Durchsuchen eines Teilstrings in einem String mit der Anweisung 'is' etwas schneller ist.

In [1]: t = ["abc_%s" % number for number in range(10000)]

In [2]: %timeit any("9999" in string for string in t)
1000 loops, best of 3: 420 µs per loop

In [3]: %timeit "9999" in ",".join(t)
10000 loops, best of 3: 103 µs per loop

Ich stimme jedoch zu, dass die anyAussage besser lesbar ist.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.