source

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

nicesource 2023. 4. 19. 23:12
반응형

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

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

하지만 목록에 모든 항목이 존재하는지 여부를 알아내는 가장 좋고 피조어적인 방법은 무엇일까요?

문서를 검색한 결과 다음과 같은 해결 방법을 발견했습니다.

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

하지만 여기서는 더 많은 타이핑을 해야 합니다.

다른 해결책이 있나요?

오퍼레이터는 다음과 같습니다.<=Python에서는 일반적으로 "작거나 같음"과 크게 다른 것을 의미하도록 재정의되지 않습니다.표준 라이브러리가 이렇게 하는 것은 흔치 않습니다. 레거시 API처럼 느껴집니다.

더 명확하게 명명된 동일한 방법을 사용합니다.set.issubset. 인수를 세트로 변환할 필요는 없습니다.필요에 따라 변환됩니다.

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

다음과 같은 방법으로 사용할 수 있습니다.

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

또는 그 반대:

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

좀 더 읽기 쉽긴 하지만 과잉 살상일 수도 있어요집합은 집합/교차/수집 간의 차이를 계산하는 데 특히 유용하지만 이 상황에서는 최상의 옵션이 아닐 수 있습니다.

이 두 가지가 가장 논리적인 것 같기 때문에 마음에 듭니다.후자는 짧고 빠를 수 있습니다(여기에서는 를 사용하고 있습니다).setPython 2.7로 역리포트된 리터럴 구문:

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

목록에 다음과 같은 중복 항목이 포함되어 있으면 어떻게 됩니까?

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)

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의 다른 개체와 마찬가지로 서로 호환됩니다.

또 다른 솔루션은 다음과 같습니다.

l = ['a', 'b', 'c']
potential_subset1 = ['a', 'b']
potential_subset2 = ['a', 'x']
print(False not in [i in l for i in potential_subset1]) # True
print(False not in [i in l for i in potential_subset2]) # False

이 솔루션이 훌륭한 이유는 목록을 인라인에 배치하여 한 줄씩 쓸 수 있다는 것입니다.

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

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

짧은 구문

Python 인터프리터로 실험하던 중 매우 읽기 쉬운 구문을 발견했습니다.

>>> my_list = [1, 2, 3, 4, 5]
>>> (6 or 7) in my_list
False
>>> (2 or 6) in my_list
True
>>> (2 and 6) in my_list
False
>>> (2 and 5) in my_list
True

검색할 항목 목록

긴 「」에.sub_list★★★★

>>> my_list = [1, 2, 3, 4, 5]
>>> sub_list = ['x', 'y']

이상의)되어 있는 (「」는 「」는 「」).or★★★★★★★★)

>>> next((True for item in sub_list if next((True for x in my_list if x == item), False)), False)
False

>>> sub_list[0] = 3
>>> next((True for item in sub_list if next((True for x in my_list if x == item), False)), False)
True

되어 있는 ( 「」 「」 「」 「」).andstatement)으로 "secondition"을 합니다.sub_list는 풀 서브셋입니다.또한 De Morgan의 법칙도 일부 포함되어 있습니다.

>>> next((False for item in sub_list if item not in my_list), True)
False

>>> sub_list[1] = 2
>>> next((False for item in sub_list if item not in my_list), True)
True
>>> next((True for item in sub_list if next((True for x in my_list if x == item), False)), False)
True

언급URL : https://stackoverflow.com/questions/3931541/how-to-check-if-all-of-the-following-items-are-in-a-list

반응형