2012-07-04 43 views
13

Tôi có một danh sách:Kiểm tra xem mục danh sách chứa các mục từ danh sách khác

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

bad = ['abc', 'def'] 

và muốn tìm kiếm cho các hạng mục có chứa chuỗi 'abc' và 'def' (và những người khác trong xấu). Làm thế nào tôi có thể làm điều đó?

Câu hỏi gần giống nhau here.

+5

Wh tại chính xác bạn đã thử và những gì không hoạt động? – msvalkon

+0

Mã hiện tại của bạn trông như thế nào? – Mizipzor

Trả lời

25

Nếu bạn chỉ muốn có một thử nghiệm, tham gia các mục tiêu liệt kê thành một chuỗi và kiểm tra từng phần tử của bad như sau:

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

Từ câu hỏi của bạn, bạn có thể kiểm tra từng yếu tố như là một chuỗi tiểu so với mỗi phần tử của người khác theo cách này:

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

Đó là nhanh chóng (so với một trong những phương pháp khác):

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

Từ nhận xét của bạn, đây là cách bạn có được những yếu tố không phù hợp:

>>> set(my_list)-{i for e in bad for i in my_list if e in i} 
{'ghi-789', 'qwe-111'} 
+0

@Alex: Sử dụng set: 'set (my_list) - {i for e in bad cho i trong my_list nếu e trong i}' – dawg

+0

Cảm ơn rất nhiều! – Alex

+0

bạn đã lưu một ngày cho tôi – Sakeer

1
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 

Rất đơn giản, hoạt động tốt và nhanh chóng (chỉ khi danh sách của bạn không phải là rất lớn.)

+0

nếu có (các mục trong s): LoạiError: đối tượng 'bool' không thể lặp lại – Alex

+1

Nó phải là 'nếu mục trong s:' Tôi đoán – jadkik94

+0

bạn nói đúng, nó sẽ là) xem các chỉnh sửa của tôi – Feanor

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

hoặc

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

Trong khi đoạn mã này có thể trả lời câu hỏi, nó không cung cấp bất kỳ bối cảnh nào để giải thích cách thức hoặc lý do. Cân nhắc thêm một hoặc hai câu để giải thích câu trả lời của bạn. – brandonscript

Các vấn đề liên quan