Różnica między list, sequence i slice w Pythonie?

Jakie są różnice między tymi wbudowanymi typami danych Pythona: Lista, sequence and slice ? Jak widzę, wszystkie trzy zasadniczo reprezentują to, co C++ i Java wywołują array .

Author: SilentGhost, 2010-05-27

5 answers

  • list to więcej niż zwykłe tablice. Można je zainicjować bez podawania liczby elementów. Możesz append/push do nich możesz remove/pop/del elementy z nich, możesz mieć listy różnych typów obiektów (np. [1,'e', [3]]), możesz mieć listy rekurencyjne... możesz też wycinać listy, co oznacza uzyskanie nowej listy zawierającej tylko kilka elementów.
  • slice są typem obiektu używanym "Za kulisami" do obsługi rozszerzonego krojenia w formie a[start:stop:step], jako help(slice) ujawnia.

"Sequence" nie jest obiektem, bardziej jak nieformalny interfejs niektórych obiektów, takich jak list implementować.

 10
Author: badp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-27 11:44:40

Mieszasz bardzo różne rzeczy w swoim pytaniu, więc odpowiem na inne pytanie;- P

Pytacie teraz o jeden z najważniejszych interfejsów w Pythonie: iterable - to w zasadzie wszystko, czego możecie użyć jak for elem in iterable.

iterable mA trzech Potomków: sequence, generator i mapping.

  • Sekwencja jest iterowalna z dostępem losowym. Możesz poprosić o dowolny element sekwencji bez konieczności konsumowania przedmiotów przed nim. Z tym właściwość, którą można zbudować slices, która daje więcej niż jeden element na raz. Wycinek może dać ciąg dalszy: seq[from:until] i każdy n-ty element: seq[from:until:nth]. list, tuple i str wszystkie są sekwencjami.

  • Jeśli dostęp odbywa się za pomocą klawiszy zamiast pozycji całkowitych, masz mapowanie. dict jest podstawowym odwzorowaniem.

  • Najbardziej podstawową iteracją jest generator . Obsługuje brak losowego dostępu, a tym samym brak krojenia. Musisz spożywać wszystkie przedmioty w kolejność, jaką otrzymują. Generator zazwyczaj tworzy ich elementy tylko wtedy, gdy je iterujesz. Powszechnym sposobem tworzenia generators są wyrażenia generatora. Wyglądają dokładnie tak, jak lista, z wyjątkiem nawiasów okrągłych, na przykład (f(x) for x in y). Wywołanie funkcji używającej słowa kluczowego yield również zwraca generator.

[19]}wspólnym adapterem dla wszystkich iterabli jest iterator {29]}. iterators mają ten sam interfejs, co najbardziej podstawowy typ, który obsługują, A generator. Są to tworzone jawnie przez wywołanie iter na iterowalnym i używane są niejawnie we wszystkich rodzajach konstrukcji pętli.
 37
Author: Jochen Ritzel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-27 13:46:05

Lista jest sekwencją, ale sekwencja niekoniecznie jest listą. Sekwencja to dowolny typ, który obsługuje interfejs sekwencji ("protokół"). Odbywa się to poprzez pisanie kaczek, a nie poprzez ścisłą hierarchię dziedziczenia. Zauważ, że sekwencje są kontenerami, ale kontenery niekoniecznie są sekwencjami. (sekwencje są, cóż, sekwencyjne!)

Zobacz http://docs.python.org/library/stdtypes.html#sequence-types-str-unicode-list-tuple-buffer-xrange

Obiekty Slice są zazwyczaj tworzone pośrednio przez syntaktyczny sugar (foo[2:5]) i dostarczane do specjalnych metod typu kontener (takich jak __getitem__), które można zastąpić. Zazwyczaj nie będziesz musiał zajmować się plasterkami, chyba że stworzysz własne sekwencje / kontenery.

Zobacz http://docs.python.org/reference/datamodel.html#specialnames

Listy są porównywalne do tablic. Nie jestem pewien, ale myślę, że jest zaimplementowana w cpythonie jako dynamicznie rozwijająca się tablica. Jednak interfejs sprawia, że jest bardziej jak wektor C++ STL niż zwykła stara tablica.

 5
Author: Jeremy Brown,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-27 11:58:15
  • Listy są typem sekwencji, podobnym do tablicy

  • Sekwencja typy opisują superset funkcjonalny:

Istnieje sześć typów sekwencji: ciągi znaków, ciągi znaków Unicode, listy, krotki, bufory i Obiekty xrange.

  • plasterki są zapisem dla submarrayów (lub podciągów, również)

Czytaj więcej ... http://docs.python.org/glossary.html

 3
Author: miku,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-27 12:03:50

Ściśle mówiąc, kawałek jest typem, który reprezentuje zakres indeksów, np. początek, stop i krok. Plasterek nie jest typem pojemnika. Możesz użyć plasterka do indeksowania listy, w wyniku czego powstaje nowa lista, która jest kopią sublisty oryginalnej listy.

Listy różnią się od tablic C++ tym, że są heterogeniczne; elementy nie muszą być tego samego typu. I jak już zauważył MYYN, "sequence" wcale nie jest typem Pythona, a raczej opisem różnorodność wbudowanych typów.

 2
Author: Peter Milley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-27 11:36:09