Kiedy w Pythonie, kiedy używać słownika, listy lub zestawu?

294

Kiedy powinienem używać słownika, listy lub zestawu?

Czy istnieją scenariusze, które są bardziej odpowiednie dla każdego typu danych?

Blankman
źródło

Odpowiedzi:

603

A listutrzymuje porządek, dicta setnie: kiedy zależy ci na porządku, musisz go użyć list(jeśli twój wybór pojemników jest ograniczony do tych trzech, oczywiście ;-).

dictkojarzy się z każdej kluczowej wartości, podczas listi setpo prostu zawierać wartości: bardzo różne przypadki użycia, oczywiście.

setwymaga, aby przedmioty były haszowalne, listnie: jeśli masz przedmioty, których nie można haszować, dlatego nie możesz ich używać seti musisz zamiast tego używać list.

setzabrania duplikowania, listnie: także istotnego rozróżnienia. (Można znaleźć „multiset”, który odwzorowuje duplikaty na inną liczbę dla przedmiotów obecnych więcej niż jeden raz collections.Counter- możesz go zbudować jako dict, jeśli z jakiegoś dziwnego powodu nie możesz zaimportować collectionslub w wersji wcześniejszej niż 2.7 Python jako a collections.defaultdict(int), używając elementów jako kluczy i powiązanej wartości jako liczby).

Sprawdzanie przynależności wartości do set(lub dictkluczy) jest niezwykle szybkie (zajmuje około stałego, krótkiego czasu), podczas gdy na liście zajmuje czas proporcjonalny do długości listy w przeciętnych i najgorszych przypadkach. Tak więc, jeśli masz przedmioty z haszowaniem, nie przejmuj się ani zamówieniem, ani duplikatami, a chcesz szybkiego sprawdzania członkostwa, setjest lepsze niż list.

Alex Martelli
źródło
6
Zauważ, że Python 3.7 ma domyślnie uporządkowany
dyktand
172
  • Potrzebujesz tylko uporządkowanej sekwencji przedmiotów? Idź po listę.
  • Czy po prostu trzeba wiedzieć, czy masz już dostał konkretną wartość, ale bez zamawiania (i nie trzeba przechowywać duplikatów)? Użyj zestawu.
  • Czy potrzebujesz powiązać wartości z kluczami, aby później móc je efektywnie wyszukać (według klucza)? Użyj słownika.
Jon Skeet
źródło
30
To powinna być część „TL; DR” powyższej odpowiedzi Alexa M. :-)
Alex Boschmans
9
Myślę, że jest na odwrót… Alex powinien przekazać swoje głosy Jonowi. Ta odpowiedź obejmuje prawie wszystko i jest o wiele bardziej zwięzła i jasna.
mehmet
jeśli jednak chcesz poznać różnicę złożoności czasu między tymi typami danych, wyjaśnienie Alexa działa lepiej
kcEmenike
19

Jeśli chcesz mieć nieuporządkowaną kolekcję unikalnych elementów, użyj set. (Na przykład, jeśli chcesz mieć zestaw wszystkich słów użytych w dokumencie).

Jeśli chcesz zebrać niezmienną uporządkowaną listę elementów, użyj tuple. (Na przykład, jeśli chcesz mieć parę (nazwa, numer_ telefonu), której chcesz użyć jako elementu w zestawie, potrzebujesz krotki zamiast listy, ponieważ zestawy wymagają elementów niezmiennych).

Jeśli chcesz zebrać zmienną uporządkowaną listę elementów, użyj list. (Na przykład, jeśli chcesz dołączyć nowe numery telefonów do listy: [liczba1, liczba2, ...]).

Jeśli chcesz mapować klucze na wartości, użyj dict. (Na przykład, jeśli chcesz książkę telefoniczną, która mapuje nazwy na numery telefonów:) {'John Smith' : '555-1212'}. Uwaga: klucze w nagraniu są nieuporządkowane. (W przypadku iteracji po słowie (książce telefonicznej) klawisze (nazwiska) mogą pojawiać się w dowolnej kolejności).

unutbu
źródło
Nie pytał o krotki.
habnabit,
18
  • Skorzystaj ze słownika, jeśli masz zestaw unikalnych kluczy odwzorowanych na wartości.

  • Użyj listy, jeśli masz uporządkowaną kolekcję przedmiotów.

  • Użyj zestawu do przechowywania nieuporządkowanego zestawu przedmiotów.

SLaks
źródło
6

W skrócie użyj:

list - jeśli potrzebujesz uporządkowanej sekwencji przedmiotów.

dict - jeśli chcesz powiązać wartości z kluczami

set - jeśli potrzebujesz zachować unikalne elementy.

Szczegółowe wyjaśnienie

Lista

Lista jest zmienną sekwencją, zwykle używaną do przechowywania kolekcji jednorodnych przedmiotów.

Lista implementuje wszystkie typowe operacje na sekwencjach:

  • x in l i 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]])- indeks pierwszego wystąpienia xw l(w lub po ii przed jindeksem)

Lista implementuje również wszystkie operacje sekwencji podlegającej mutacji:

  • l[i] = x- artykuł iz lzastąpionox
  • l[i:j] = t- plasterek lod ido jzastępuje się treścią iterowalnąt
  • del l[i:j] - taki sam jak l[i:j] = []
  • l[i:j:k] = t- elementy l[i:j:k]są zastąpione tymi zt
  • del l[i:j:k]- usuwa elementy s[i:j:k]z listy
  • l.append(x)- dołącza xna końcu sekwencji
  • l.clear()- usuwa wszystkie elementy z l(tak samo jak del l[:])
  • l.copy()- tworzy płytką kopię l(taką samą jak l[:])
  • l.extend(t)lub l += t- rozszerza się lwraz z zawartościąt
  • l *= n- aktualizacje lz zawartością powtarzane nrazy
  • l.insert(i, x)- wkładki xjęzyk lw wskaźnika danej przezi
  • l.pop([i])- pobiera element z, ia także usuwa go zl
  • l.remove(x)- usuń pierwszy element, z lktórego l[i]jest równy x
  • l.reverse()- odwraca pozycje lna miejscu

Listę można wykorzystać jako stos, korzystając z metod appendi pop.

Słownik

Słownik mapuje wartości skrótu na dowolne obiekty. Słownik jest obiektem zmiennym. Głównymi operacjami na słowniku jest przechowywanie wartości z pewnym kluczem i wyodrębnianie wartości z danego klucza.

W słowniku nie można używać jako kluczy wartości, które nie są haszowalne, to znaczy wartości zawierające listy, słowniki lub inne typy zmienne.

Zestaw

Zestaw to nieuporządkowana kolekcja różnych obiektów możliwych do skrótu. Zestaw jest powszechnie używany do testowania członkostwa, usuwania duplikatów z sekwencji i obliczania operacji matematycznych, takich jak przecięcie, połączenie, różnica i różnica symetryczna.

lmiguelvargasf
źródło
5

Chociaż nie obejmuje to sets, jest to dobre wyjaśnienie dicts i lists:

Listy są tym, czym się wydają - listą wartości. Każdy z nich jest ponumerowany, zaczynając od zera - pierwszy ma numer zero, drugi 1, trzeci 2 itd. Możesz usunąć wartości z listy i dodać nowe wartości na końcu. Przykład: imiona Twoich wielu kotów.

Słowniki są podobne do tego, co sugeruje ich nazwa - słownik. W słowniku masz „indeks” słów, a dla każdego z nich definicję. W Pythonie słowo to nazywa się „kluczem”, a definicja „wartością”. Wartości w słowniku nie są ponumerowane - tara podobna do tego, co sugeruje ich nazwa - słownik. W słowniku masz „indeks” słów, a dla każdego z nich definicję. Wartości w słowniku nie są numerowane - nie są też w żadnej określonej kolejności - klucz robi to samo. Możesz dodawać, usuwać i modyfikować wartości w słownikach. Przykład: książka telefoniczna.

http://www.sthurlow.com/python/lesson06/

Gęś
źródło
4

W przypadku C ++ zawsze miałem na uwadze ten schemat blokowy: w jakim scenariuszu używam określonego kontenera STL? , więc byłem ciekawy, czy coś podobnego jest dostępne również dla Python3, ale nie miałem szczęścia.

W Pythonie należy pamiętać o tym, że: Nie ma jednego standardu Python jak dla C ++. Stąd mogą istnieć ogromne różnice dla różnych interpretatorów Pythona (np. CPython, PyPy). Poniższy schemat blokowy dotyczy CPython.

Dodatkowo stwierdzono, że nie ma dobrego sposobu, aby naniesienie następujące struktury danych na wykresie: bytes, byte arrays, tuples, named_tuples, ChainMap, Counter, i arrays.

  • OrderedDicti dequesą dostępne za pośrednictwem collectionsmodułu.
  • heapqjest dostępny z heapqmodułu
  • LifoQueue, Queuei PriorityQueuesą dostępne za pośrednictwem queuemodułu, który jest przeznaczony do równoczesnego dostępu (wątków). (Jest też multiprocessing.Queuedostępny, ale nie znam różnic, queue.Queueale zakładam, że należy go użyć, gdy potrzebny jest równoczesny dostęp z procesów).
  • dict, set, frozen_set, I listsą oczywiście wbudowane

Byłbym wdzięczny za poprawienie tej odpowiedzi i przedstawienie lepszego schematu pod każdym względem. Zapraszam i zapraszam. schemat blokowy

PS: schemat został wykonany za pomocą yed. Plik graphml jest tutaj

matematyki
źródło
3

W połączeniu z listami , dictami i zestawami istnieje również inny interesujący obiekt pytona, OrdersDicts .

Uporządkowane słowniki są jak zwykłe słowniki, ale pamiętają kolejność wstawiania elementów. Podczas iteracji nad uporządkowanym słownikiem elementy są zwracane w kolejności, w której klucze zostały po raz pierwszy dodane.

Uporządkowane dyktaty mogą być przydatne, gdy trzeba zachować kolejność kluczy, na przykład podczas pracy z dokumentami: Często potrzebna jest reprezentacja wektorowa wszystkich terminów w dokumencie. Tak więc za pomocą OrdersDicts możesz skutecznie sprawdzić, czy termin został przeczytany wcześniej, dodać terminy, wyodrębnić warunki, a po wszystkich manipulacjach możesz wyodrębnić ich uporządkowaną reprezentację wektorową.

Federico Caccia
źródło
1

Listy są tym, czym się wydają - listą wartości. Każdy z nich jest ponumerowany, zaczynając od zera - pierwszy ma numer zero, drugi 1, trzeci 2 itd. Możesz usunąć wartości z listy i dodać nowe wartości na końcu. Przykład: imiona Twoich wielu kotów.

Krotki są jak listy, ale nie można zmienić ich wartości. Wartości, które podajesz jako pierwsze, to wartości, których utknąłeś w pozostałej części programu. Ponownie, każda wartość jest ponumerowana począwszy od zera, dla łatwego odniesienia. Przykład: nazwy miesięcy roku.

Słowniki są podobne do tego, co sugeruje ich nazwa - słownik. W słowniku masz „indeks” słów, a dla każdego z nich definicję. W Pythonie słowo to nazywa się „kluczem”, a definicja „wartością”. Wartości w słowniku nie są ponumerowane - tara podobna do tego, co sugeruje ich nazwa - słownik. W słowniku masz „indeks” słów, a dla każdego z nich definicję. W Pythonie słowo to nazywa się „kluczem”, a definicja „wartością”. Wartości w słowniku nie są numerowane - nie są też w żadnej określonej kolejności - klucz robi to samo. Możesz dodawać, usuwać i modyfikować wartości w słownikach. Przykład: książka telefoniczna.

Nitish Kumar Pal
źródło
1

Kiedy ich używam, tworzę obszerną ściągę ich metod w celach informacyjnych:

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'}}
Rachunek różniczkowy
źródło
1

Słownik: słownik Pythona jest używany jak tablica skrótów z kluczem jako indeksem i obiektem jako wartością.

Lista: lista służy do przechowywania obiektów w tablicy indeksowanej według pozycji tego obiektu w tablicy.

Zestaw: zestaw to kolekcja z funkcjami, które pozwalają stwierdzić, czy obiekt jest obecny, czy nie.

Srinivas P
źródło