Différence entre list, sequence et slice en Python?

quelles sont les différences entre ces types de données Python: liste, ordre et tranche? Comme je le vois, les trois représentent essentiellement ce que C++ et Java appellent array.

21
demandé sur SilentGhost 2010-05-27 15:24:52

5 réponses

  • list sont plus que des tableaux simples. Vous pouvez initialiser sans donner le nombre d'éléments. Vous pouvez append/push pour eux, vous pouvez remove/pop/del des éléments, vous pouvez avoir les listes des différents types d'objets (par exemple, [1,'e', [3]]), vous pouvez avoir récursive des listes... et, vous pouvez découper les listes, ce qui signifie l'obtention d'une nouvelle liste, avec seulement quelques points.
  • slice est-ce qu'un type d'objet est utilisé "dans les coulisses" pour traiter le tranchage prolongé dans le a[start:stop:step] formulaire help(slice) révèle.

"Séquence" n'est pas un objet, plus comme un informel de l'interface de certains objets comme list mise en œuvre.

10
répondu badp 2010-05-27 11:44:40

vous mélangez des choses très différentes dans votre question, donc je vais juste répondre à une question différente; - P

vous demandez maintenant à propos de L'une des interfaces Les plus importantes en Python: iterable - c'est en gros tout ce que vous pouvez utiliser comme for elem in iterable.

iterable a trois descendants: sequence,generator et mapping.

  • ordre est itérable avec accès aléatoire. Vous pouvez demander à n'importe quel élément de la séquence sans devoir consommer les articles avant lui. Avec cette propriété, vous pouvez construire slices, qui vous donnent plus d'un élément à la fois. Une tranche peut vous donner une sous-suite: seq[from:until] et chaque nième élément: seq[from:until:nth]. list,tuple et str tous sont des séquences.

  • si l'accès se fait via des touches au lieu de positions entières, vous avez un cartographie. dict est la cartographie de base.

  • le plus élémentaire itérable est un générateur. Il ne supporte aucun accès aléatoire et donc aucun découpage. Vous devez consommer tous les éléments dans l'ordre où ils sont donnés. Générateur généralement qu'à créer leurs éléments lorsque vous parcourez. La façon la plus courante de créer generators sont des expressions de générateur. Ils ressemblent exactement à la compréhension de liste, sauf avec des crochets ronds, par exemple (f(x) for x in y). L'appel d'une fonction qui utilise le yield le mot-clé renvoie aussi un générateur.

La commune adaptateur à toutes les itérables est le iterator. iterators ont la même interface que le type le plus basique qu'ils supportent, un generator. Ils sont créés explicitement en appelant iter sur un objet iterable et sont implicitement utilisé dans toutes sortes de boucles.

37
répondu Jochen Ritzel 2010-05-27 13:46:05

une liste est Une séquence une séquence est pas nécessairement une liste. Une séquence est tout type qui supporte l'interface séquentielle ("protocole"). Cela se fait en tapant du canard plutôt que par une hiérarchie d'héritage stricte. Notez que les séquences sont des conteneurs, mais les conteneurs ne sont pas nécessairement des séquences. (les séquences sont, bien, séquentielle!)

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

les objets Slice sont généralement créés implicitement via le sucre syntaxique (foo[2:5]) et fourni au type de conteneur des méthodes spéciales (telles que __getitem__) que vous pouvez remplacer. Vous n'aurez généralement pas à traiter avec des tranches sauf si vous créez vos propres séquences/conteneurs.

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

les listes sont comparables aux tableaux. Je n'en suis pas certain, mais je pense que c'est implémenté dans cPython comme un réseau en expansion dynamique. Cependant, l'interface le rend tel qu'il ressemble plus à un vecteur C++ STL qu'à un simple vieux tableau.

5
répondu Jeremy Brown 2010-05-27 11:58:15
  • listes sont un type de séquence, similaire à un tableau

  • ordre types de décrire un sur-ensemble fonctionnel:

il existe six types de séquences: les chaînes, les chaînes Unicode, les listes, les tuples, les buffers et les objets xrange.

  • tranches sont de notation pour les sous-tableaux (ou des sous-chaînes, aussi)

Lire la suite ... http://docs.python.org/glossary.html

3
répondu miku 2010-05-27 12:03:50

a proprement parler, une tranche est un type qui représente une gamme d'indices, par exemple un début, un arrêt, et un pas. Une tranche n'est pas du tout un type de conteneur. Vous pouvez utiliser une tranche à l'index d'une liste, résultant en une nouvelle liste qui est une copie d'une sous-liste de la liste d'origine.

les listes diffèrent des tableaux C++ en ce qu'elles sont hétérogènes; il n'est pas nécessaire que les éléments soient du même type. Et comme MYYN L'a déjà souligné, "sequence" n'est pas du tout un type Python mais plutôt une description d'une variété de types intégrés.

2
répondu Peter Milley 2010-05-27 11:36:09