私はリストを持っています:
my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456', 'def-111', 'qwe-111']
bad = ['abc', 'def']
文字列「abc」と「def」(およびその他の不良)を含むアイテムを検索したい。どうやってやるの?
ここでほぼ同じ質問。
bad
テストが必要な場合は、ターゲットリストを文字列に結合し、次のように各要素をテストします。
>>> my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456', 'def-111', 'qwe-111']
>>> bad = ['abc', 'def']
>>> [e for e in bad if e in '\n'.join(my_list)]
['abc', 'def']
あなたの質問から、あなたはこの方法で他の各要素に対してサブ文字列として各要素をテストすることができます:
>>> [i for e in bad for i in my_list if e in i]
['abc-123', 'abc-456', 'def-456', 'def-111']
それは速いです(他の方法の1つと比較して):
>>> def f1():
... [item for item in my_list if any(x in item for x in bad)]
...
>>> def f2():
... [i for e in bad for i in my_list if e in i]
...
>>> timeit.Timer(f1).timeit()
5.062238931655884
>>> timeit.Timer(f2).timeit()
1.35371994972229
コメントから、一致しない要素を取得する方法は次のとおりです。
>>> set(my_list)-{i for e in bad for i in my_list if e in i}
{'ghi-789', 'qwe-111'}
In [4]: filter(lambda item: any(x in item for x in bad), my_list)
Out[4]: ['abc-123', 'def-456', 'abc-456', 'def-111']
また
In [13]: [item for item in my_list if any(x in item for x in bad)]
Out[13]: ['abc-123', 'def-456', 'abc-456', 'def-111']
some_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
bad = ['abc', 'def']
for s in some_list:
for item in bad:
if item in s:
print 'Found ', s
シンプルで、問題なく高速に動作します(リストがそれほど大きくない場合のみ)。
some_list=['abc-123', 'def-456', 'ghi-789', 'abc-456']
bad = ['abc', 'def']
for i in range (0,len(bad)):
if bad[i] in some_list:
print('Found a bad entry:', bad[i])