2011-01-30 2 views
329

내부 문자열 내가 목록이 포함되어있는 경우 :확인 파이썬 목록 항목이 다른 문자열

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

및 문자열 'abc'를 포함하는 항목을 검색 할를. 어떻게해야합니까? 'abc'이 목록에 존재하지만이 'abc-123''abc-456'의 일부인 경우

if 'abc' in my_list: 

확인할 것 'abc' 자체에 존재하지 않습니다. 그렇다면 'abc'을 포함한 모든 항목을 어떻게 얻을 수 있습니까? 당신은 단지 목록에있는 문자열 abc의 존재를 확인하려는 경우 당신이 정말로 모든 항목이 abc를 포함 얻고 싶은 경우에

+11

반대를 확인하려면 : http://stackoverflow.com/a/6531704/2436175 – Antonio

답변

555

, 당신은

를 사용

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

을 시도 할 수

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

내가 있는지 확인해야 하나의 항목은 6 개의 요소로 구성됩니다. 6 "if"를하는 것이 더 빠릅니까? 아니면 똑같습니까? –

+19

@OlivierPons, myarray에서 myitem을 사용하는 경우 : – alldayremix

+5

하위 문자열 'abc'가 포함 된 모든 문자열을 가져 오는 또 다른 방법은 다음과 같습니다. 'filter (엘레멘트에서'abc '요소, some_list)' – hangtwenty

9
x = 'aaa' 
L = ['aaa-12', 'bbbaaa', 'cccaa'] 
res = [y for y in L if x in y] 
6
any('abc' in item for item in mylist) 
61

사용 filter는이 요소에서 얻을 수 있습니다 abc.

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

목록 이해 기능을 사용할 수도 있습니다. 그것은 이미 list 유형에 사용되기 때문에 그런데

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

는 변수 이름으로 단어 list를 사용하지 마십시오.

8
for item in my_list: 
    if item.find("abc") != -1: 
     print item 
+0

이 접근법을 사용하려는 경우 "abc '항목을 사용하는 것이 더 관용적이라고 생각합니다. 'item.find ('abc') == -1'을 사용합니다. –

19

이것은 이전 질문에서 문자열 (또는 반복 가능한 개체)이 아닌 항목에 대처하지 못하기 때문에이 대답을 제공합니다. 이러한 항목은 전체 목록 이해가 예외로 인해 실패하게 만듭니다. 이러한 목록, 다음

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

반복 가능 여부에 대한 테스트가 좋지 않을 수 있습니다. 여기에서있어 : In Python, how do I determine if an object is iterable?

+0

주어진 예제에서 'el과 el (st in el)]'이 더 의미가있는 경우'[el에 대한 el]은 없습니까? – tinix

+0

@tinix 비 반복 객체를 정상적으로 처리하지 않겠습니까? –

+0

"주어진 예" 을 my_list '='ABC-123 ','DEF-456 ','GHI-789 ','ABC-456 ']' 이상을 복잡하게 할 필요없이. – tinix

37

그냥 거기에이 밖으로 던지기 : 둘 이상의 문자열에 대해 일치해야하는 일이있는 경우, 예를 abcdef에 대해 다음과 같이 두 개의 지능형리스트를 결합 넣을 수 있습니다 :

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

정확히 내가 뭘 찾았는지 .. 고마워! – N8TRO

+1

당신은 또한 {s for my_list in s for xs in s}}를 사용할 수 있습니다 (중괄호는 고유 한 집합을 만듭니다). ''any'가 첫 번째 매치에서 효율적으로 멈추기 때문에 대부분의's '값이 일치하면 더 읽기가 쉽지만 느려질 수 있습니다. –

0

는 성명 '에 대해'항상 시간을 소모합니다.

목록 길이가 길어지면 실행 시간도 늘어납니다.

저는 '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 문이 더 읽기 동의합니다.

14

이 가장 짧은 방법입니다 : (하나의 문자열은 여러 문자열 중 하나가 포함 된 경우)

if 'abc' in str(my_list): 
+0

'abc1 ","1abc2 "] 목록에 문자열'abc '가 새로 생성 된 문자열에 있기 때문에 일치하지 않을 경우이 작업은 실패합니다. – cgseller

+0

예, 이것은 의도 한 동작입니다. true 항목 중 하나에 'abc'가 포함되어있는 경우 – RogerS

+0

나는 왜이 모든 사람들이 필요하지 않을 때 이러한 복잡한 람다 솔루션을 수행하기로 결정했는지 알지 못합니다. 좋은 직장 @ 로저스 – ntk4