다음 항목이 모두 목록에 있는지 확인하는 방법은 무엇입니까?


113

목록에 하나 이상의 항목이 있는지 찾는 방법에 대한 관련 질문이 있음을 발견 했습니다. 다음 항목 중 하나가 목록
에 있는지 확인하는 방법은 무엇입니까?

그러나 모든 항목이 목록에 있는지 여부를 찾는 가장 좋고 비단뱀적인 방법은 무엇입니까?

문서를 검색하여이 솔루션을 찾았습니다.

>>> l = ['a', 'b', 'c']
>>> set(['a', 'b']) <= set(l)
True
>>> set(['a', 'x']) <= set(l)
False

다른 해결책은 다음과 같습니다.

>>> l = ['a', 'b', 'c']
>>> all(x in l for x in ['a', 'b'])
True
>>> all(x in l for x in ['a', 'x'])
False

그러나 여기서 더 많은 타이핑을해야합니다.

다른 해결책이 있습니까?


5
뭐가 문제 야 set(smaller) <= set(larger)?
eumiro

1
'all'을 사용한 두 번째 솔루션은 나에게 훌륭하고 비단뱀처럼 보입니다.
Jiho Noh

답변:


156

<=Python 과 같은 연산자 는 일반적으로 "작거나 같음"과 크게 다른 의미로 재정의되지 않습니다. 표준 라이브러리에서이 작업을 수행하는 것은 드문 경우입니다. 레거시 API 냄새가납니다.

동등하고 더 명확하게 이름이 지정된 방법 인 set.issubset. 인수를 집합으로 변환 할 필요가 없습니다. 필요한 경우 그렇게 할 것입니다.

set(['a', 'b']).issubset(['a', 'b', 'c'])

2
issubset에 대한 인수로 목록을 직접 전달할 수 있다는 것을 몰랐습니다.
tsimbalar

1
나는 감정에 동의하지만 같은 것을 생각 <=하고 issubset의미하는 것은 꽤 괜찮습니다 . 왜 싫어합니까?
Kirk Strauser

2
@Just : 주로 <=문서에서 찾아 보거나 세트 이론에서 의미하는 바에 대한 사전 지식없이 세트에 대한 의미가 분명하지 않기 때문에 모든 사람이 issubset자동으로 의미를 알고 있습니다.
Glenn Maynard

2
(부적절한) 부분 집합에 대한 수학 연산자를 알고 있습니까? 기본적으로 둥글게 된 <=;)
dom0

이 솔루션을 사랑하십시오. bool (True : False) 대신 색인 위치 또는 목록 값을 얻는 방법이 있습니까?
Vlad Gulin 2018

62

아마도 set다음과 같은 방식으로 사용할 것입니다 .

set(l).issuperset(set(['a','b'])) 

또는 그 반대의 경우 :

set(['a','b']).issubset(set(l)) 

좀 더 읽기 쉽지만 과도 할 수 있습니다. 집합은 컬렉션 간의 합집합 / 교차 / 차이를 계산하는 데 특히 유용하지만이 상황에서는 최선의 선택이 아닐 수 있습니다.


사실 MySet.issubset(MyOtherSet)MySet <= MyOtherSet동일합니다.
Wok

1
@wok : 오, 몰랐습니다.하지만 <= 구문은 비슷한 구문을 목록과 함께 사용할 수 있지만 의미가 매우 다르기 때문에 약간 혼란 스럽습니다.
tsimbalar

3
포함이 어떤 세트의 세트에 대한 부분적인 순서를 정의한다는 것을 상기하면 실제로 그렇게 혼란스럽지 않습니다. <=시퀀스에 대해 의미하는 것은 실제로 약간 혼란 스럽 습니다. 사전 순이 아닌 '하위 시퀀스'를 의미 할 것으로 예상 할 수 있습니다.
aaronasterling

1
@aaronasterling : mmm, 개인적으로 코드를 입력 할 때 "부분 순서"에 대해 너무 많이 생각하지는 않지만, <=시퀀스와 함께 사용 하는 것도 왠지 이상하게 느껴진다 는 사실에 동의합니다 ...
tsimbalar

3
나는 여기에 내가 언급하고 싶은 작은 잡았다으로 실행 :이 방법을 사용하면 된다 더 중복을 의미하는 세트에 목록을 변환. set(['a','a']).issubset(['a'])를 반환합니다 True.
Orangestar

11

나는이 두 가지가 가장 논리적으로 보이기 때문에 좋아합니다. 후자는 더 짧고 아마도 가장 빠를 것입니다 (여기서는 Python 2.7 set백 포트 된 리터럴 구문을 사용하여 표시됨 ).

all(x in {'a', 'b', 'c'} for x in ['a', 'b'])
#   or
{'a', 'b'}.issubset({'a', 'b', 'c'})

"all"솔루션은 timeit ()로 측정 할 때 가장 빠릅니다. 이것은 받아 들여진 대답이어야합니다.
Attersson

3

목록에 다음과 같은 중복 항목이 포함 된 경우 :

v1 = ['s', 'h', 'e', 'e', 'p']
v2 = ['s', 's', 'h']

세트는 중복을 포함하지 않습니다. 따라서 다음 줄은 True를 반환합니다.

set(v2).issubset(v1)

중복을 계산하려면 다음 코드를 사용할 수 있습니다.

v1 = sorted(v1)
v2 = sorted(v2)


def is_subseq(v2, v1):
    """Check whether v2 is a subsequence of v1."""
    it = iter(v1)
    return all(c in it for c in v2) 

따라서 다음 줄은 False를 반환합니다.

is_subseq(v2, v1)

1

이것은 내가 온라인에서 검색했지만 불행히도 온라인이 아니라 파이썬 인터프리터를 실험하는 동안 발견되었습니다.

>>> case  = "caseCamel"
>>> label = "Case Camel"
>>> list  = ["apple", "banana"]
>>>
>>> (case or label) in list
False
>>> list = ["apple", "caseCamel"]
>>> (case or label) in list
True
>>> (case and label) in list
False
>>> list = ["case", "caseCamel", "Case Camel"]
>>> (case and label) in list
True
>>>

그리고 변수 목록이 너무 많으면 sublist variable

>>>
>>> list  = ["case", "caseCamel", "Case Camel"]
>>> label = "Case Camel"
>>> case  = "caseCamel"
>>>
>>> sublist = ["unique banana", "very unique banana"]
>>>
>>> # example for if any (at least one) item contained in superset (or statement)
...
>>> next((True for item in sublist if next((True for x in list if x == item), False)), False)
False
>>>
>>> sublist[0] = label
>>>
>>> next((True for item in sublist if next((True for x in list if x == item), False)), False)
True
>>>
>>> # example for whether a subset (all items) contained in superset (and statement)
...
>>> # a bit of demorgan's law
...
>>> next((False for item in sublist if item not in list), True)
False
>>>
>>> sublist[1] = case
>>>
>>> next((False for item in sublist if item not in list), True)
True
>>>
>>> next((True for item in sublist if next((True for x in list if x == item), False)), False)
True
>>>
>>>

0

람다 식을 사용하여이를 수행하는 방법의 예는 다음과 같습니다.

issublist = lambda x, y: 0 in [_ in x for _ in y]

1
귀하의 답변을 설명 / 정교화하기 위해 의견을 추가하십시오
Sharad

0

OP의 경우는 아니지만- 딕셔너리 에서 교차점을 주장 하고 열악한 인터넷 검색 (예 : 나)으로 인해 여기 에 도착한 사람은 dict.items다음 과 같이 작업해야합니다 .

>>> a = {'key': 'value'}
>>> b = {'key': 'value', 'extra_key': 'extra_value'}
>>> all(item in a.items() for item in b.items())
True
>>> all(item in b.items() for item in a.items())
False

그 이유 dict.items는 키 / 값 쌍의 튜플을 반환하고 Python의 모든 객체와 매우 비슷하기 때문입니다.

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