簡體   English   中英

檢查列表項是否包含來自另一個列表的子字符串

[英]Check if list items contains substrings from another list

我有一個清單:

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

它很快(與其他方法之一相比):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM