답변:
A는 list
주문을 유지 dict
하고 set
하지 말아야 할 것 : 주문에 관심이있을 때는 반드시 사용해야합니다 list
(컨테이너 선택이이 세 가지로 제한되는 경우 물론 ;-).
dict
각 키 값을 가진 동료, 동안 list
과 set
분명히 매우 다른 사용 사례 : 단지 값이 포함되어 있습니다.
set
해시 가능 항목이 필요 list
하지 않습니다. 해시 가능 항목이 없으면 사용할 수 없으며 set
대신 사용해야 list
합니다.
set
중복을 금지 list
하지 않으며 중요한 차이점도 아닙니다. 항목에 대해 서로 다른 계산에 중복 매핑 (A "MULTISET는"한 번 이상,에서 찾을 수 있습니다 선물합니다 collections.Counter
- 당신이 하나를 만들 수있다 dict
, 만약 당신이 수있는 몇 가지 이상한 이유는 아니다 수입 collections
에서, 또는 사전 2.7 collections.defaultdict(int)
항목을 키로 사용하고 관련 값을 개수로 사용하여 Python ).
set
(또는 dict
키의 경우) 값의 멤버쉽을 확인하는 것은 엄청나게 빠르며 (일정하고 짧은 시간을 사용함), 목록에서는 평균 및 최악의 경우 목록의 길이에 비례하여 시간이 걸립니다. 당신이 해쉬 항목이 경우에 따라서, 주문 또는 중복에 대한 어느 쪽이든 상관, 그리고 빠른 회원 검사를하지 않는 set
것보다 낫다 list
.
정렬되지 않은 고유 요소 컬렉션을 원할 경우을 사용하십시오 set
. (예를 들어, 문서에 사용 된 모든 단어 세트를 원할 때).
변경 불가능한 순서로 정렬 된 요소 목록을 수집하려면을 사용하십시오 tuple
. (예를 들어, 세트에서 요소로 사용하려는 (name, phone_number) 쌍을 원할 경우 세트가 요소를 변경할 수 없으므로 목록이 아닌 튜플이 필요합니다).
가변 순서로 정렬 된 요소 목록을 수집하려면을 사용하십시오 list
. (예 : 목록에 새 전화 번호를 추가하려는 경우 : [number1, number2, ...]).
키에서 값으로 매핑하려면을 사용하십시오 dict
. (예를 들어, 전화 번호에 이름을 매핑하는 전화 번호부를 원할 경우 :) {'John Smith' : '555-1212'}
. dict의 키는 순서가 없습니다. dict (전화 번호부)을 반복하면 키 (이름)가 임의의 순서로 표시 될 수 있습니다.
간단히 말해서 다음을 사용하십시오.
list
-주문한 순서의 항목이 필요한 경우.
dict
-값을 키와 관련시켜야하는 경우
set
-고유 한 요소를 유지해야하는 경우
목록은 일반적으로 동종 항목의 컬렉션을 저장하는 데 사용되는 변경 가능한 시퀀스입니다.
리스트는 모든 공통 시퀀스 연산을 구현합니다.
x in l
과 x not in l
l[i]
, l[i:j]
,l[i:j:k]
len(l)
, min(l)
,max(l)
l.count(x)
l.index(x[, i[, j]])
-의 첫번째 발생의 색인 x
에서 l
(또는 그 이후 i
와 이전 j
굴절률들)또한리스트는 변경 가능한 모든 시퀀스 작업을 구현합니다.
l[i] = x
- 항목 i
의 l
로 대체x
l[i:j] = t
- 조각 l
에서 i
로는 j
반복자의 내용으로 대체t
del l[i:j]
-와 동일 l[i:j] = []
l[i:j:k] = t
-의 요소는 l[i:j:k]
다음 의 요소로 대체t
del l[i:j:k]
- s[i:j:k]
목록에서 요소를 제거합니다l.append(x)
- x
시퀀스의 끝에 추가l.clear()
-에서 모든 항목을 제거합니다 l
(del과 동일 l[:]
).l.copy()
-의 얕은 사본을 만듭니다 l
(와 동일 l[:]
)l.extend(t)
또는 l += t
- l
내용으로 확장t
l *= n
- 업데이트 l
에 그 내용을 반복 n
번l.insert(i, x)
- 삽입 x
에 l
의해 지정된 인덱스에서i
l.pop([i])
-에서 항목을 검색하고 i
제거합니다.l
l.remove(x)
-x와 같은 l
곳 에서 첫 번째 항목을 제거하십시오.l[i]
l.reverse()
- l
제자리에 있는 항목을 뒤집 습니다목록이 방법을 이용하여 적층으로 사용될 수 append
와 pop
.
사전은 해시 가능 값을 임의의 객체에 매핑합니다. 사전은 변경 가능한 객체입니다. 사전의 주요 작업은 일부 키와 함께 값을 저장하고 해당 키에서 주어진 값을 추출하는 것입니다.
사전에서는 해시 가능하지 않은 키 값, 즉 목록, 사전 또는 기타 변경 가능한 유형을 포함하는 값으로 사용할 수 없습니다.
세트는 고유 한 해시 가능 객체의 정렬되지 않은 컬렉션입니다. 집합은 일반적으로 멤버쉽 테스트, 시퀀스에서 중복 제거, 교차, 합집합, 차이 및 대칭 차이와 같은 수학 연산 계산을 포함하는 데 사용됩니다.
이것은 set
s를 다루지 않지만 dict
s와 list
s에 대한 좋은 설명입니다 .
목록은 그들이 보이는 것-값의 목록입니다. 이들 각각은 0부터 시작하여 번호가 매겨집니다. 첫 번째는 0, 두 번째 1, 세 번째 2 등입니다. 목록에서 값을 제거하고 끝에 새 값을 추가 할 수 있습니다. 예 : 많은 고양이 이름.
사전은 이름에서 제안하는 사전과 유사합니다. 사전에는 단어의 '인덱스'가 있으며 각 단어마다 정의가 있습니다. 파이썬에서는 단어를 '키'라고하고 정의를 '값'이라고합니다. 사전의 값은 번호가 매겨져 있지 않으며 이름에서 제안하는 것과 비슷한 용기 값입니다. 사전에는 단어의 '인덱스'가 있으며 각 단어마다 정의가 있습니다. 사전의 값은 번호가 매겨져 있지 않으며 특정한 순서가 아니거나 키도 마찬가지입니다. 사전의 값을 추가, 제거 및 수정할 수 있습니다. 예 : 전화 번호부.
C ++의 경우 항상이 흐름도를 염두에 두었습니다. 어떤 시나리오에서 특정 STL 컨테이너를 사용합니까? 그래서 Python3에서도 비슷한 것을 사용할 수 있는지 궁금했지만 운이 없었습니다.
파이썬에서 명심해야 할 것은 : C ++에 대한 단일 파이썬 표준은 없습니다. 따라서 다른 파이썬 인터프리터 (예 : CPython, PyPy)에는 큰 차이가있을 수 있습니다. 다음 순서도는 CPython에 대한 것입니다.
또한 내가 그림에 다음 데이터 구조를 통합 할 수있는 좋은 방법을 찾을 수 없습니다 : bytes
, byte arrays
, tuples
, named_tuples
, ChainMap
, Counter
,와 arrays
.
OrderedDict
과 deque
를 통해 사용할 수있는 collections
모듈.heapq
heapq
모듈 에서 사용 가능LifoQueue
, Queue
및 동시 (스레드) 액세스 용으로 설계된 모듈을 PriorityQueue
통해 사용할 수 queue
있습니다. ( multiprocessing.Queue
사용 가능한 것도 있지만 차이점을 queue.Queue
모르지만 프로세스에서 동시 액세스가 필요할 때 사용해야한다고 가정합니다.)dict
, set
, frozen_set
, 그리고 list
물론 내장되어이 답변을 개선하고 모든 측면에서 더 나은 다이어그램을 제공 할 수 있다면 누구나 감사 할 것입니다. 부담없이 환영하십시오.
추신 : 다이어그램은 yed로 만들어졌습니다. graphml 파일 은 여기
list , dicts 및 sets 와 함께 흥미로운 Python 객체 인 OrderedDicts도 있습니다.
정렬 된 사전은 일반 사전과 유사하지만 항목이 삽입 된 순서를 기억합니다. 정렬 된 사전을 반복하면 키가 처음 추가 된 순서대로 항목이 반환됩니다.
OrderedDicts 는 키 순서를 유지해야 할 때 유용합니다 (예 : 문서 작업). 문서에서 모든 용어의 벡터 표현이 일반적입니다. 따라서 OrderedDicts 를 사용 하면 이전에 용어를 읽었는지, 용어를 추가하고, 용어를 추출하고, 모든 조작 후에 순서화 된 벡터 표현을 추출 할 수 있습니다.
기울기 은 보이는 것처럼 보이는 값입니다. 이들 각각은 0부터 시작하여 번호가 매겨집니다. 첫 번째는 0, 두 번째 1, 세 번째 2 등입니다. 목록에서 값을 제거하고 끝에 새 값을 추가 할 수 있습니다. 예 : 많은 고양이 이름.
튜플 은 목록과 같지만 값을 변경할 수 없습니다. 당신이 먼저 포기하는 가치는 당신이 프로그램의 나머지 부분에 붙어있는 가치입니다. 다시, 각 값은 쉽게 참조 할 수 있도록 0부터 시작하여 번호가 매겨집니다. 예 : 연도의 이름.
사전 은 이름에서 제안하는 사전과 유사합니다. 사전에는 단어의 '인덱스'가 있으며 각 단어마다 정의가 있습니다. 파이썬에서는 단어를 '키'라고하고 정의를 '값'이라고합니다. 사전의 값은 번호가 매겨져 있지 않으며 이름에서 제안하는 것과 비슷한 용기 값입니다. 사전에는 단어의 '인덱스'가 있으며 각 단어마다 정의가 있습니다. 파이썬에서는 단어를 '키'라고하고 정의를 '값'이라고합니다. 사전의 값은 번호가 매겨져 있지 않으며 특정한 순서가 아니거나 키도 마찬가지입니다. 사전의 값을 추가, 제거 및 수정할 수 있습니다. 예 : 전화 번호부.
그것들을 사용할 때, 나는 당신의 참고를 위해 그들의 방법에 대한 완전한 치트 시트를 만듭니다.
class ContainerMethods:
def __init__(self):
self.list_methods_11 = {
'Add':{'append','extend','insert'},
'Subtract':{'pop','remove'},
'Sort':{'reverse', 'sort'},
'Search':{'count', 'index'},
'Entire':{'clear','copy'},
}
self.tuple_methods_2 = {'Search':'count','index'}
self.dict_methods_11 = {
'Views':{'keys', 'values', 'items'},
'Add':{'update'},
'Subtract':{'pop', 'popitem',},
'Extract':{'get','setdefault',},
'Entire':{ 'clear', 'copy','fromkeys'},
}
self.set_methods_17 ={
'Add':{['add', 'update'],['difference_update','symmetric_difference_update','intersection_update']},
'Subtract':{'pop', 'remove','discard'},
'Relation':{'isdisjoint', 'issubset', 'issuperset'},
'operation':{'union' 'intersection','difference', 'symmetric_difference'}
'Entire':{'clear', 'copy'}}