Python에서 구별되는 요소만 포함하는 목록을 만드는 방법은 무엇입니까?
파이썬에 목록이 있는데, 어떻게 하면 그것의 가치를 고유하게 만들 수 있습니까?
가장 간단한 방법은 집합으로 변환한 후 다시 목록으로 변환하는 것입니다.
my_list = list(set(my_list))
이것의 한 가지 단점은 질서가 유지되지 않는다는 것입니다.또한 집합이 목록 대신 처음에 사용하기에 더 나은 데이터 구조인지 여부를 고려할 수도 있습니다.
http://www.peterbe.com/plog/uniqifiers-benchmark 의 수정된 버전
순서 보존하기
def f(seq): # Order preserving
''' Modified version of Dave Kirby solution '''
seen = set()
return [x for x in seq if x not in seen and not seen.add(x)]
자, 이제 어떻게 작동하죠? 여기는 좀 까다롭거든요.if x not in seen and not seen.add(x)
:
In [1]: 0 not in [1,2,3] and not print('add')
add
Out[1]: True
True를 반환하는 이유는 무엇입니까? print(및 set.add)는 아무것도 반환하지 않습니다.
In [3]: type(seen.add(10))
Out[3]: <type 'NoneType'>
그리고.not None == True
그러나:
In [2]: 1 not in [1,2,3] and not print('add')
Out[2]: False
[1]에서는 'add'로 인쇄되지만 [2]에서는 인쇄되지 않는 이유는 무엇입니까?봐False and print('add')
두 번째 인수는 이미 정답을 알고 있으므로 확인하지 않고 두 번째 인수가 모두 True인 경우에만 true를 반환합니다.
보다 일반적인 버전, 보다 읽기 쉽고 생성기 기반으로 다음과 같은 기능을 사용하여 값을 변환할 수 있습니다.
def f(seq, idfun=None): # Order preserving
return list(_f(seq, idfun))
def _f(seq, idfun=None):
''' Originally proposed by Andrew Dalke '''
seen = set()
if idfun is None:
for x in seq:
if x not in seen:
seen.add(x)
yield x
else:
for x in seq:
x = idfun(x)
if x not in seen:
seen.add(x)
yield x
주문 없이(더 빠름):
def f(seq): # Not order preserving
return list(set(seq))
원라이너로 질서를 유지하는 것.
list(OrderedDict.fromkeys([2,1,1,3]))
필요하시겠지만
from collections import OrderedDict
예를 들어 설명하겠습니다.
파이썬 목록이 있는 경우
>>> randomList = ["a","f", "b", "c", "d", "a", "c", "e", "d", "f", "e"]
중복 항목을 제거하려고 합니다.
>>> uniqueList = []
>>> for letter in randomList:
if letter not in uniqueList:
uniqueList.append(letter)
>>> uniqueList
['a', 'f', 'b', 'c', 'd', 'e']
이렇게 하면 목록에서 중복 항목을 제거할 수 있습니다.
순서 보존하기
l = [1, 1, 2, 2, 3]
result = list()
map(lambda x: not x in result and result.append(x), l)
result
# [1, 2, 3]
사전 편찬은 어떻습니까?
>>> mylist = [3, 2, 1, 3, 4, 4, 4, 5, 5, 3]
>>> {x:1 for x in mylist}.keys()
[1, 2, 3, 4, 5]
편집 @Danny의 코멘트: 제 원래 제안은 키를 순서대로 유지하지 않습니다.키를 정렬해야 하는 경우 다음을 시도합니다.
>>> from collections import OrderedDict
>>> OrderedDict( (x,1) for x in mylist ).keys()
[3, 2, 1, 4, 5]
요소가 처음 발생할 때까지 요소를 순서대로 유지합니다(광범위하게 테스트되지 않음).
Python 세트의 특징은 세트의 데이터 항목이 정렬되지 않고 중복이 허용되지 않는다는 것입니다.데이터 항목이 이미 포함된 집합에 데이터 항목을 추가하려고 하면 Python은 이를 무시합니다.
>>> l = ['a', 'a', 'bb', 'b', 'c', 'c', '10', '10', '8','8', 10, 10, 6, 10, 11.2, 11.2, 11, 11]
>>> distinct_l = set(l)
>>> print(distinct_l)
set(['a', '10', 'c', 'b', 6, 'bb', 10, 11, 11.2, '8'])
목록의 모든 요소를 사전 키로 사용할 수 있는 경우(즉, 모두 해시 가능) 이보다 빠른 경우가 많습니다.Python 프로그래밍 FAQ
d = {}
for x in mylist:
d[x] = 1
mylist = list(d.keys())
http://www.peterbe.com/plog/uniqifiers-benchmark 에서:
def f5(seq, idfun=None):
# order preserving
if idfun is None:
def idfun(x): return x
seen = {}
result = []
for item in seq:
marker = idfun(item)
# in old Python versions:
# if seen.has_key(marker)
# but in new ones:
if marker in seen: continue
seen[marker] = 1
result.append(item)
return result
순서를 유지하면서 중복을 제거하는 가장 간단한 방법은 컬렉션을 사용하는 것입니다.주문형 딕트(파이썬 2.7+).
from collections import OrderedDict
d = OrderedDict()
for x in mylist:
d[x] = True
print d.iterkeys()
언급URL : https://stackoverflow.com/questions/4459703/how-to-make-lists-contain-only-distinct-element-in-python
'programing' 카테고리의 다른 글
특정 환경을 위한 springyml 파일 (0) | 2023.07.13 |
---|---|
호출 가능한 클라우드 기능이 HTTP 기능보다 더 낫습니까? (0) | 2023.07.13 |
날짜별 주문 처음부터 마지막 날짜까지 NULL 표시 (0) | 2023.07.13 |
문서 지향 데이터베이스는 관계형 데이터베이스를 대체하기 위한 것입니까? (0) | 2023.07.13 |
Oracle 세션과 연결 풀 간의 관계 (0) | 2023.07.13 |