"|"를 사용하지 않고 두 세트를 한 줄로 연결하는 방법
라고 가정합니다.S
그리고.T
할당된 세트입니다.조인 연산자 사용 안 함|
, 두 세트의 결합을 찾으려면 어떻게 해야 하나요?예를 들어, 다음과 같이 교차로를 찾습니다.
S = {1, 2, 3, 4}
T = {3, 4, 5, 6}
S_intersect_T = { i for i in S if i in T }
그럼 어떻게 하지 않고 두 세트의 합집합을 한 줄로 찾을 수 있을까요?|
?
집합에는 합집합법을 사용할 수 있습니다.set.union(other_set)
새 집합이 반환됩니다. 즉, 자체를 수정하지 않습니다.
사용할 수 있습니다.or_
에일리어스:
>>> from operator import or_
>>> from functools import reduce # python3 required
>>> reduce(or_, [{1, 2, 3, 4}, {3, 4, 5, 6}])
set([1, 2, 3, 4, 5, 6])
(경우에 따라서는) 원래 세트를 변경할 수 있는 경우set.update()
:
S.update(T)
반환값은None
,그렇지만S
원본의 결합으로 업데이트될 것입니다.S
그리고.T
.
또한 사용할 수 없는 경우s.union(t)
에 상당합니다.s | t
, 시험해 볼 수 있습니다.
>>> from itertools import chain
>>> set(chain(s,t))
set([1, 2, 3, 4, 5, 6])
이해를 원한다면
>>> {i for j in (s,t) for i in j}
set([1, 2, 3, 4, 5, 6])
다음과 같이 두 세트를 하나로 압축 해제할 수 있습니다.
>>> set_1 = {1, 2, 3, 4}
>>> set_2 = {3, 4, 5, 6}
>>> union = {*set_1, *set_2}
>>> union
{1, 2, 3, 4, 5, 6}
그*
세트를 개봉합니다.포장을 푸는 것은 반복 가능한 것(세트 또는 목록 등)이 산출되는 모든 항목으로 나타나는 것입니다.즉, 위의 예는 다음과 같습니다.{1, 2, 3, 4, 3, 4, 5, 6}
그 후, 간단하게{1, 2, 3, 4, 5, 6}
세트에는 고유한 항목만 포함될 수 있습니다.
결합을 의미한다면 다음을 시도해 보십시오.
set(list(s) + list(t))
좀 엉터리지만, 더 좋은 라이너가 생각나지 않아요.
리스트가 2개 있다고 가정합니다.
A = [1,2,3,4]
B = [3,4,5,6]
찾을 수 있도록A
유니언B
다음과 같이
union = set(A).union(set(B))
또한 교차로와 비교차로를 찾으려면 다음과 같이 하십시오.
intersection = set(A).intersection(set(B))
non_intersection = union - intersection
할수있습니다union
또는 단순한 목록 이해
[A.add(_) for _ in B]
A는 B의 모든 요소를 가지고 있을 것이다.
가입하고 싶다면n
최고의 퍼포먼스라고 생각되는 것은set().union(*list_of_sets)
새 세트가 반환됩니다.
따라서 사용법은 다음과 같습니다.
s1 = {1, 2, 3}
s2 = {2, 3, 4}
s3 = {4, 5, 6}
s1.union(s2, s3) # returns a new set
# Out: {1, 2, 3, 4, 5, 6}
s1.update(s2, s3) # updates inplace
위의 Alexander Klimenko의 답변에 덧붙여 아래와 같이 간단한 테스트를 실시했습니다.가장 중요한 점은 세트가 랜덤할수록 성능 차이가 커진다는 것입니다.
from random import randint
n = 100
generate_equal = lambda: set(range(10_000))
generate_random = lambda: {randint(0, 100_000) for _ in range(10_000)}
for l in [
[generate_equal() for _ in range(n)],
[generate_random() for _ in range(n)]
]:
%timeit set().union(*l)
%timeit reduce(or_, l)
Out:
# equal sets: 69.5 / 23.6 =~ 3
23.6 ms ± 658 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
69.5 ms ± 2.57 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
# random sets: 438 / 78.7 =~ 5.6
78.7 ms ± 1.48 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
438 ms ± 20.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
따라서 인플레이스 업데이트를 원하는 경우 최고의 퍼포먼스는set.update
방법, 즉 퍼포먼스,s1.update(s2, s3) = set().union(s2, s3)
.
언급URL : https://stackoverflow.com/questions/17429123/how-to-join-two-sets-in-one-line-without-using
'programing' 카테고리의 다른 글
판독 가능한/계층 형식으로 배열 표시 (0) | 2022.09.16 |
---|---|
Mysql 성능 불량 (0) | 2022.09.16 |
레일 이행(MySQL)에서 새로운 컬럼의 위치를 지정할 수 있습니까? (0) | 2022.09.16 |
""", """ 및 페르시아어의 차이점 - Mysql (0) | 2022.09.16 |
긴 패스워드(72자 이상)를 복어와 해시하는 방법 (0) | 2022.09.16 |