So überprüfen Sie, ob eine Zeichenfolge eine Teilzeichenfolge von Elementen in einer Liste von Zeichenfolgen ist

Lesezeit: 5 Minuten

Benutzer-Avatar
SandyBr

Wie suche ich nach Elementen, die die Zeichenfolge enthalten 'abc' in der folgenden Liste?

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

Das Folgende überprüft, ob 'abc' ist in der Liste, wird aber nicht erkannt 'abc-123' und 'abc-456':

if 'abc' in xs:

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

    – Antonio

    18. November 2014 um 10:48 Uhr

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

    – Georgi

    6. Februar 2019 um 10:19 Uhr

  • Siehe auch diese Antwort von Raymond Hettinger (die eher eine Antwort auf diese Frage sein sollte).

    – mkrieger1

    11. August 2021 um 9:38 Uhr

Benutzer-Avatar
Sven Marnach

Um das Vorhandensein von zu überprüfen 'abc' in einer beliebigen Zeichenfolge in der Liste:

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

if any("abc" in s for s in xs):
    ...

Um alle Artikel zu erhalten, die enthalten 'abc':

matching = [s for s in xs 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 dasselbe?

    – Olivier Pons

    10. März 2013 um 0:11 Uhr

  • Eine andere Möglichkeit, alle Zeichenfolgen zu erhalten, die die Teilzeichenfolge ‘abc’ enthalten: filter(lambda element: 'abc' in element, some_list)

    – m_floer

    31. Mai 2013 um 20:10 Uhr

  • @p014k: benutze die index() Methode: try: return mylist.index(myitem); except ValueError: pass

    – Sven Marnach

    16. Oktober 2014 um 12:02 Uhr

  • @midkin: Ich verstehe weder, was genau Sie versucht haben, 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 haben und was er tatsächlich getan hat. “Hat nicht funktioniert” ist völlig bedeutungslos, wenn Sie nicht 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 funktioniert hat.

    – Sven Marnach

    16. Februar 2015 um 13:11 Uhr

  • @LarryCai Der Scheck "abc" in some_string wird auf Vorhandensein prüfen "abc" als exakter, zusammenhängender Teilstring von some_stringalso beides "abc" in "cba-4123" und "abc" in "a-b-c" wird zurückkehren False. Keine Änderung des Codes erforderlich.

    – Sven Marnach

    13. September 2021 um 9:12 Uhr

Benutzer-Avatar
fantastisch

Werfen Sie das einfach raus: Wenn Sie zum Beispiel zufällig mit mehr als einer Saite übereinstimmen müssen abc und defkönnen Sie zwei Verständnisse wie folgt kombinieren:

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']

  • Das war genau das, wonach ich gegoogelt hatte. Danke!

    – N8TRO

    6. Juli 2016 um 21:13 Uhr

  • Könntest du auch verwenden {s for s in my_list for xs in matchers if xs in s} (Beachten Sie die geschweiften Klammern, um ein einzigartiges Set zu erstellen). Könnte einfacher zu lesen sein, könnte aber langsamer sein, wenn die meisten s Werte werden übereinstimmen, da Ihre any wird effizient beim ersten Spiel aufhören.

    – Matthias Fripp

    9. Januar 2018 um 18:47 Uhr

  • ERSTAUNLICH – in einer ähnlichen Situation würde ich pandas str.contains verwenden, aber mit Listen ist das perfekt

    – data_runner

    20. April um 6:50 Uhr

Benutzer-Avatar
MAK

Verwenden filter um alle Elemente zu erhalten, die haben 'abc':

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

Man kann auch ein Listenverständnis verwenden:

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

Benutzer-Avatar
RogerS

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):

Hinweis: Dies setzt voraus, dass „abc“ ein alphanumerischer Text ist. Verwenden Sie es nicht, wenn ‘abc’ nur ein Sonderzeichen sein könnte (z []’, ).

Benutzer-Avatar
Robert Mül

Dies ist eine ziemlich alte Frage, aber ich biete diese Antwort an, weil die vorherigen Antworten nicht mit Elementen in der Liste fertig werden, 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 solche Elemente in der Liste durch Überspringen der nicht iterierbaren Elemente ordnungsgemäß zu behandeln:

[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. Got it from here: Wie stelle ich in Python fest, ob ein Objekt iterierbar ist?

  • Würde nicht [el for el in lst if el and (st in el)] in dem gegebenen Beispiel mehr Sinn machen?

    – Gordo

    1. Oktober 2016 um 6:20 Uhr

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

    – Robert Muil

    17. Oktober 2016 um 8:31 Uhr

  • “gegebenes Beispiel” my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456'] keine Notwendigkeit, es zu verkomplizieren.

    – Gordo

    17. Oktober 2016 um 20:15 Uhr


  • Ja, absolut – die akzeptierte Antwort ist perfekt geeignet und mein Vorschlag ist komplizierter, also zögern Sie nicht, ihn zu ignorieren – ich habe nur angeboten, falls jemand das gleiche Problem wie ich hatte: Nicht iterierbare Elemente in solchen Listen sind eine reale Möglichkeit obwohl es im gegebenen Beispiel nicht vorhanden ist.

    – Robert Muil

    18. Oktober 2016 um 18:28 Uhr

Benutzer-Avatar
jamylak

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

  • Würde nicht [el for el in lst if el and (st in el)] in dem gegebenen Beispiel mehr Sinn machen?

    – Gordo

    1. Oktober 2016 um 6:20 Uhr

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

    – Robert Muil

    17. Oktober 2016 um 8:31 Uhr

  • “gegebenes Beispiel” my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456'] keine Notwendigkeit, es zu verkomplizieren.

    – Gordo

    17. Oktober 2016 um 20:15 Uhr


  • Ja, absolut – die akzeptierte Antwort ist perfekt geeignet und mein Vorschlag ist komplizierter, also zögern Sie nicht, ihn zu ignorieren – ich habe nur angeboten, falls jemand das gleiche Problem wie ich hatte: Nicht iterierbare Elemente in solchen Listen sind eine reale Möglichkeit obwohl es im gegebenen Beispiel nicht vorhanden ist.

    – Robert Muil

    18. Oktober 2016 um 18:28 Uhr

Benutzer-Avatar
jamylak

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

  • Wenn Sie diesen Ansatz wählen, denke ich, dass es idiomatischer ist if 'abc' in item eher verwenden item.find('abc') == -1.

    – Wyatt Baldwin

    10. März 2016 um 22:22 Uhr


1138200cookie-checkSo überprüfen Sie, ob eine Zeichenfolge eine Teilzeichenfolge von Elementen in einer Liste von Zeichenfolgen ist

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy