programing

"|"를 사용하지 않고 두 세트를 한 줄로 연결하는 방법

javaba 2022. 9. 16. 22:13
반응형

"|"를 사용하지 않고 두 세트를 한 줄로 연결하는 방법

라고 가정합니다.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

반응형