Pythonリストアイテムに別の文字列内の文字列が含まれているかどうかを確認する


588

リストがあります:

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

そして、文字列を含むアイテムを検索したいとします'abc'。どうやってやるの?

if 'abc' in my_list:

'abc'リストに存在するかどうかを確認しますが、それは'abc-123'およびの一部であり'abc-456''abc'それ自体では存在しません。では、どのようにしてすべてのアイテムを取得できます'abc'か?


19
反対をチェックするには(1つの文字列に複数の文字列の1つが含まれている場合):stackoverflow.com/a/6531704/2436175
Antonio

エントリの左側の部分が一意である場合は、リストから辞書を作成することを検討してください。部分的な文字列に基づいてリストからエントリを検索する
Georgy

回答:


931

abcリスト内の任意の文字列の存在を確認するだけの場合は、

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

を含むすべてのアイテムを本当に取得したい場合はabc

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

1つのアイテムが6つの要素の配列にあるかどうかを確認する必要があります。「6」の場合は「6」の方が速いですか、それとも同じですか。
Olivier Pons 2013年

42
@OlivierPons、ただif myitem in myarray:
alldayremix

8
サブストリング「abc」を含むすべてのストリングを取得する別の方法:filter(lambda element: 'abc' in element, some_list)
ドリフトキャッチャー

2
@ p014k:使用index()方法:try: return mylist.index(myitem); except ValueError: pass
スヴェンMarnach

1
@midkin:私はあなたが何をしようとしていたのか正確には理解していません。新しい質問をしたり([質問する]ボタンを使用)、正確なコードをコピーしたり、コードで何を期待したり、実際に何をしたりすることで、より多くの幸運が得られるでしょう。この文脈で「機能する」の意味を定義しない限り、「機能しなかった」はまったく意味がありませんが、それでも、機能しなかったことを言うのではなく、実際に発生したことを説明する方が良いでしょう。
Sven Marnach、2015

104

これを捨てるだけです。たとえばabcandのようにdef、複数の文字列と照合する必要がある場合、次のように2つの内包表記を組み合わせることができます。

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

出力:

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

4
これはまさに私が探していたものでした。ありがとう。
N8TRO 2016

2
また、使用することもできます{s for s in my_list for xs in matchers if xs in s}(一意のセットを作成するには、中括弧に注意してください)。読みやすいかもしれませんが、ほとんどのs値が一致する場合anyは、最初の一致で効率的に停止するため、遅くなる可能性があります。
Matthias Fripp

82

を使用filterして要素を取得するために使用しますabc

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

リスト内包表記を使用することもできます。

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

ちなみに、単語listは既にlist型で使用されているため、変数名として使用しないでください。


50

「abc」が項目の1つにあるかどうかを知る必要があるだけの場合、これが最短の方法です。

if 'abc' in str(my_list):

1
["abc1"、 "1abc2"]のリストがある場合、文字列 'abc'が新しく作成された文字列に含まれるため、これは失敗します
cgseller

2
はい、これは意図された動作です...アイテムのいずれかに「abc」が含まれている場合はtrue
RogerS

7
他のすべての人々が、必要のないときに複雑なラムダソリューションを実行することにした理由がわかりません!ナイスジョブ@RogerS
ntk4 '14

1
実際、同じ質問がほぼ答えてくれます...あと3文字追加しました。
RogerS 2017

1
これは良い解決策ですが、指定された文字列を含むアイテムを検索たい場合、成功しません。ここで、文字列を含むアイテムがあるかどうを確認します。
cslotty

18

これはかなり古い質問ですが、以前の回答では文字列(または、ある種の反復可能なオブジェクト)ではないリストの項目には対応していないため、この回答を提供します。このような項目があると、リスト全体の理解が例外で失敗します。

反復不可能な項目をスキップしてリスト内のそのような項目を適切に処理するには、以下を使用します。

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

次に、そのようなリストで:

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

あなたはまだ一致するアイテムを取得します(['abc-123', 'abc-456']

反復可能かどうかのテストは最善ではないかもしれません。ここから取得:Pythonでは、オブジェクトが反復可能かどうかをどのように判断しますか?


[el for el in lst if el and (st in el)]与えられた例ではもっと意味がありませんか?
Gordo

@tinix反復不可能なオブジェクトを正常に処理しませんか?
Robert Muil 2016年

「与えられた例」 my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456'] それを過度に複雑にする必要はありません。
Gordo、2016年

1
確かに-受け入れられた回答は完全に適切であり、私の提案はより複雑なので、無視してください-誰かが私と同じ問題を抱えている場合に備えて提供しました:そのようなリストの反復不可能なアイテムは現実世界の可能性です与えられた例には存在しないにもかかわらず
Robert Muil 2016年

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



4

__contains__()Pythons文字列クラスのメソッドを使用します。:

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

3

Pythonは初めてです。以下のコードを機能させて、理解しやすくしました。

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)

Python3.6では、これによりエラーが発生します。TypeError:期待される文字列またはバイトのようなオブジェクト
AimForClarity

1
@AimForClarityはい。python3.6のre.findallは文字列を想定しています。別の方法は、リストを文字列に変換することです 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)
arun_munagala

1
不十分な書式設定でごめんなさい。何らかの理由で適切な改行を行うことができませんでした。
arun_munagala 2018

0

私は検索を行いましたが、特定の値を入力する必要があります。次に、入力を含むリストから値を探します。

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)

「abc」を検索してみてください。



0

次のように、一致に対応するリストインデックスが必要でした。

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

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

出力

[0, 3]

-1

質問: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

私の知る限りでは、「for」ステートメントは常に時間を消費します。

リストの長さが長くなると、実行時間も長くなります。

「is」ステートメントを使用して文字列内の部分文字列を検索する方が少し高速だと思います。

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

しかし、私はany声明がより読みやすいことに同意します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.