Check if list items contains substrings from another list

后端 未结 4 1685
梦毁少年i
梦毁少年i 2020-11-29 09:28

I have a lists:

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

bad = [\'abc\', \'def\']

and want

相关标签:
4条回答
  • 2020-11-29 09:43

    If you just want a test, join the target list into a string and test each element of bad like so:

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

    From your question, you can test each element as a sub string against the each element of the other this way:

    >>> [i for e in bad for i in my_list if e in i]
    ['abc-123', 'abc-456', 'def-456', 'def-111']
    

    It is fast (in comparison to one of the other methods):

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

    From your comment, here is how you get the elements that do not match:

    >>> set(my_list)-{i for e in bad for i in my_list if e in i}
    {'ghi-789', 'qwe-111'}
    
    0 讨论(0)
  • 2020-11-29 09:45
    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']
    

    or

    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']
    
    0 讨论(0)
  • 2020-11-29 09:59
    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])
    
    0 讨论(0)
  • 2020-11-29 10:02
    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
    

    It's simple, works fine and fast( only if your list is not very big.)

    0 讨论(0)
提交回复
热议问题