sourcetip

여러 목록에 포함된 모든 값의 결합을 만드는 Pythonic 방법

fileupload 2023. 8. 1. 20:43
반응형

여러 목록에 포함된 모든 값의 결합을 만드는 Pythonic 방법

목록이 있습니다.

lists = [[1,4,3,2,4], [4,5]]

이 목록을 평평하게 만들고 모든 중복 항목을 제거하거나 연합 작업 집합을 적용합니다.

desired_result = [1, 2, 3, 4, 5]

이것을 하는 가장 쉬운 방법은 무엇입니까?

set.union 원하는 작업 수행:

>>> results_list = [[1,2,3], [1,2,4]]
>>> results_union = set().union(*results_list)
>>> print(results_union)
set([1, 2, 3, 4])

두 개 이상의 목록을 사용하여 이 작업을 수행할 수도 있습니다.

Python 2.5를 사용하는 것 같으니 (참고로 현재 운영 중인 버전인 != 2.6에 대한 A가 필요하다면 Q에 언급하면 좋을 것 같습니다;-) 결과적으로 세트가 아닌 목록을 원하는 것을 추천합니다.

import itertools

...

return list(set(itertools.chain(*result_list)))

iter 도구는 일반적으로 반복기(그리고 많은 종류의 시퀀스 또는 컬렉션)와 함께 작업할 수 있는 좋은 방법이며, 저는 여러분이 그것에 익숙해지길 진심으로 추천합니다.itertools.chain특히, 는 여기에 문서화되어 있습니다.

이 스타일을 따를 수도 있습니다.

In [12]: a = ['Orange and Banana', 'Orange Banana']
In [13]: b = ['Grapes', 'Orange Banana']
In [14]: c = ['Foobanana', 'Orange and Banana']

In [20]: list(set(a) | set(b) | set(c))
Out[20]: ['Orange and Banana', 'Foobanana', 'Orange Banana', 'Grapes']

In [21]: list(set(a) & set(b) | set(c))
Out[21]: ['Orange and Banana', 'Foobanana', 'Orange Banana']    

이해하는 방법으로:

[*{ j for i in lists for j in i }]

또는

[*functools.reduce(lambda x,y: {*x, *y}, lists)]

조합은 순서가 지정된 목록에서 지원되지 않지만 집합에서 지원됩니다.set.union을 확인합니다.

저는 집합이 필요하지 않게 교차로를 만들기 위해 다음을 사용했습니다.

a, b= [[1,2,3], [1,2]]
s = filter( lambda x: x in b, a)

아니면,

s = [ x for x in b if x in a ]
desired_result = [x for y in lists for x in y]

언급URL : https://stackoverflow.com/questions/2151517/pythonic-way-to-create-union-of-all-values-contained-in-multiple-lists

반응형