Python 목록 항목에 다른 문자열 안에 문자열이 포함되어 있는지 확인


587

나는 목록이있다 :

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

문자열이 포함 된 항목을 검색하려고합니다 'abc'. 어떻게해야합니까?

if 'abc' in my_list:

있는지 확인 할 'abc'목록에 존재하지만 그것의 일부 'abc-123''abc-456', 'abc'그 자체에 존재하지 않습니다. 그렇다면 어떻게 모든 항목을 얻을 수 'abc'있습니까?


19
반대를 확인하려면 (한 문자열에 여러 문자열 중 하나가 포함 된 경우) : stackoverflow.com/a/6531704/2436175
Antonio

항목의 왼쪽 부분이 고유 한 경우 목록에서 dict 구성을 고려하십시오. 부분 문자열을 기반으로 목록에서 항목 찾기
Georgy

답변:


930

abc목록에 문자열 이 있는지 확인하려는 경우 시도해 볼 수 있습니다

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

당신이 정말로 모든 항목 포함을 얻고 싶은 경우에 abc사용

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

하나의 항목이 6 개의 요소 배열에 있는지 확인해야합니다. 6 "if"를하는 것이 더 빠릅니까?
Olivier Pons

42
@OlivierPons, 그냥if myitem in myarray:
alldayremix

8
하위 문자열 'abc'를 포함하는 모든 문자열을 가져 오는 또 다른 방법 :filter(lambda element: 'abc' in element, some_list)
driftcatcher

2
@ p014k : 사용 index()방법 :try: return mylist.index(myitem); except ValueError: pass
스벤 Marnach

1
@ midkin : 정확히 무엇을하려고했는지, 어떻게 잘못되었는지 이해하지 못합니다. 새로운 질문 ( "질문하기"버튼 사용)을 요청하고 정확한 코드를 복사하고 코드에서 예상했던 작업과 실제로 수행 한 작업을 통해 더 많은 행운을 얻게 될 것입니다. 이 문맥에서 "작동"이 의미하는 것을 정의하지 않는 한 "작동하지 않았다"는 완전히 의미가 없지만, 그렇지 않은 것을 말하는 대신 실제로 발생하는 것을 설명하는 것이 좋습니다.
Sven Marnach

104

이것을 밖으로 던지기 : 예를 들어 abcand와 같이 둘 이상의 문자열과 일치 해야하는 경우 def다음과 같이 두 가지 이해를 결합 할 수 있습니다.

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

4
이것은 내가 인터넷 검색에 사용한 것입니다 .. 감사합니다!
N8TRO

2
당신은 또한 사용할 수 있습니다 {s for s in my_list for xs in matchers if xs in s}(중괄호를 사용하여 고유 한 세트를 만드십시오). 읽기가 더 쉽지만 대부분의 s값이 일치 any하면 첫 번째 일치에서 효율적으로 중지 되므로 속도가 느려질 수 있습니다 .
Matthias Fripp

82

filter가있는 요소를 얻는 데 사용하십시오 abc.

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

목록 이해도 사용할 수 있습니다.

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

그건 그렇고, 단어 list가 이미 list유형에 사용되었으므로 변수 이름으로 단어 를 사용하지 마십시오 .


50

'abc'가 항목 중 하나에 있는지 알아야하는 경우 가장 짧은 방법입니다.

if 'abc' in str(my_list):

1
일치하는 항목을 찾을 것입니다 당신이 [ "ABC1", "1abc2"]의 목록이 있다면이 실패 때문에 문자열 'ABC'새로 만들어진 문자열에있을 것입니다
cgseller

2
예, 이것은 의도 된 행동입니다 ... 어떤 항목에 'abc'가 포함되어 있으면 true
RogerS

7
다른 모든 사람들이 왜 필요하지 않을 때 복잡한 람다 솔루션을 선택하기로 결정했는지 모르겠습니다! 좋은 직업 @RogerS
ntk4

1
실제로 같은 질문이 거의 스스로 대답합니다 ... 나는 단지 3 글자를 추가했습니다.
RogerS

1
좋은 해결책이지만 주어진 문자열이 포함 된 항목 을 찾으려면 성공하지 못합니다. 여기 에 문자열이 포함 된 항목이 있는지 확인 하십시오 .
cslotty

18

이것은 오래된 질문이지만 이전 답변이 문자열 (또는 반복 가능한 객체)이 아닌 목록의 항목에 대처하지 못하기 때문에이 답변을 제공합니다. 이러한 항목으로 인해 전체 목록 이해가 예외로 실패합니다.

반복 불가능한 항목을 건너 뛰어 목록에서 이러한 항목을 정상적으로 처리하려면 다음을 사용하십시오.

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

iterable 테스트가 최선이 아닐 수도 있습니다. 여기에서 알 수 있습니다 : 파이썬에서 객체가 반복 가능한지 어떻게 알 수 있습니까?


[el for el in lst if el and (st in el)]주어진 예에서 더 이해가 되지 않습니까?
Gordo

@tinix 반복 불가능한 객체를 정상적으로 처리하지 않습니까?
Robert Muil

"주어진 예" my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456'] 는 그것을 복잡하게 할 필요가 없습니다.
Gordo

1
네, 절대적으로-받아 들인 대답이 완벽하게 적합하고 내 제안이 더 복잡하므로 무시해도 좋습니다. 누군가와 같은 문제가있는 경우에 대비하여 제공했습니다. 주어진 예제에 존재하지 않지만.
Robert Muil

13
x = 'aaa'
L = ['aaa-12', 'bbbaaa', 'cccaa']
res = [y for y in L if x in y]

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

3
이 접근법을 if 'abc' in item사용 하려면 오히려을 사용 하는 것이 관용적이라고 생각합니다 item.find('abc') == -1.
Wyatt Baldwin


4

__contains__()Pythons 문자열 클래스 의 메소드를 사용하십시오 .

a = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
for i in a:
    if i.__contains__("abc") :
        print(i, " is containing")

3

저는 Python을 처음 사용합니다. 아래 코드가 작동하고 이해하기 쉽도록했습니다.

my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
for str in my_list:
    if 'abc' in str:
       print(str)

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

for item in my_list:
    if (item.find('abc')) != -1:
        print ('Found at ', item)

0
mylist=['abc','def','ghi','abc']

pattern=re.compile(r'abc') 

pattern.findall(mylist)

Python3.6에서는 다음과 같은 오류가 발생합니다. TypeError : 예상 문자열 또는 바이트와 유사한 객체
AimForClarity

1
@AimForClarity 예. python3.6의 re.findall은 문자열을 예상합니다. 대안은리스트를 문자열로 변환하는 것입니다 import re mylist=['abc','def','ghi','abcff'] my_list_string=''.join(mylist) string_to_find="abc" res=re.findall(string_to_find,my_list_string) print(res)
arun_munagala

1
형식이 잘못되어 죄송합니다. 어떤 이유로 적절한 줄 바꿈을 수행 할 수 없습니다.
arun_munagala

0

검색을 수행했는데 특정 값을 입력해야합니다. 입력 한 값이 포함 된 목록에서 값을 찾습니다.

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

imp = raw_input('Search item: ')

for items in my_list:
    val = items
    if any(imp in val for items in my_list):
        print(items)

'abc'를 검색하십시오.


0
def find_dog(new_ls):
    splt = new_ls.split()
    if 'dog' in splt:
        print("True")
    else:
        print('False')


find_dog("Is there a dog here?")

0

다음과 같이 일치하는 목록 색인 이 필요했습니다 .

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

[n for n, x in enumerate(lst) if 'abc' in x]

산출

[0, 3]

-1

질문 : ABC의 정보를 제공

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


    aa = [ string for string in a if  "abc" in string]
    print(aa)

Output =>  ['abc-123', 'abc-456']

-2

내 지식으로는 'for'문은 항상 시간을 소비합니다.

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.