Comment déclarer un tableau en Python?

491

Comment déclarer un tableau en Python ?

Je ne trouve aucune référence aux tableaux dans la documentation.

Peter Mortensen
la source
121
Pour une raison insondable, Python appelle les tableaux "listes". L'école de conception de langage «tout le monde sait ce que l'on appelle ainsi nous allons l'appeler quelque chose d'autre». C'est un choix de nom particulièrement mauvais, car il ressemble à une liste chaînée plutôt qu'à un tableau.
Glenn Maynard
42
@Glenn Maynard: probablement parce que dans les langages de type C, les tableaux sont de longueur fixe alors que les listes Python ne le sont pas. Son plus comme le vecteur STL en C ++ ou ArrayList en Java.
MAK
128
Cela s'appelle une liste, parce que c'est une liste. [A (), 1, «Foo», u'öäöäö », 67L, 5.6]. Une liste. Un tableau est "un agencement d'éléments à des adresses également espacées dans la mémoire de l'ordinateur" (wikipedia).
Lennart Regebro
35
Rien sur le terme universellement compris "tableau" ne suggère une longueur fixe ou quoi que ce soit sur le contenu; ce ne sont que des limites de l'implémentation particulière de C des tableaux. Les listes Python sont également espacées (pointeurs vers des objets, en interne), sinon __getitem__elles ne seraient pas O (1).
Glenn Maynard
24
@Glenn, de en.wikipedia.org/wiki/Array_data_structure: "les éléments d'une structure de données de tableau doivent avoir la même taille" (vrai pour les tableaux de Python, pas vrai pour les listes Python) et "ensemble de tuples d'index valides et les adresses des éléments (et donc la formule d'adressage des éléments) sont généralement fixes lorsque le tableau est en cours d'utilisation "(ce n'est pas vrai en Python pour la liste ou le tableau).
Alex Martelli

Réponses:

358
variable = []

Désigne maintenant variableune liste vide * .

Bien sûr, c'est une mission, pas une déclaration. Il n'y a aucun moyen de dire en Python "cette variable ne doit jamais faire référence à autre chose qu'à une liste", car Python est typé dynamiquement.


* Le type Python intégré par défaut est appelé une liste , pas un tableau. C'est un conteneur ordonné de longueur arbitraire qui peut contenir une collection hétérogène d'objets (leurs types n'ont pas d'importance et peuvent être librement mélangés). Cela ne doit pas être confondu avec le arraymodule , qui propose un type plus proche du arraytype C ; le contenu doit être homogène (tous du même type), mais la longueur reste dynamique.

sepp2k
la source
11
Serait-il possible d'initialiser le contenu du tableau, comme en JavaScript? (par exemple, comme variable = ["Hi", "Hello"];?)
Anderson Green
6
@AndersonGreen Oui.
sepp2k
3
Comment déclareriez-vous alors un tableau multidimensionnel (par exemple, un tableau 2D?)
Anderson Green
7
@AndersonGreen Comme je l'ai dit, il n'y a rien de tel qu'une déclaration de variable en Python. Vous créer une liste multidimensionnelle en prenant une liste vide et mettre d' autres listes à l' intérieur ou, si les dimensions de la liste sont connus à l' écriture du temps, vous pouvez simplement écrire comme un littéral comme ceci: my_2x2_list = [[a, b], [c, d]]. En fonction de ce dont vous avez besoin pour les tableaux multidimensionnels, vous pouvez également envisager d'utiliser numpy, qui définit les types de tableau pour les tableaux multidimensionnels, homogènes et sans boîte qui peuvent être beaucoup plus efficaces le cas échéant, ils sont donc préférables pour les calculs numériques.
sepp2k
1
@IfanIqbal Oui, s'il contient au moins un élément, vous le pouvez.
sepp2k
136

C'est un sujet étonnamment complexe en Python.

Réponse pratique

Les tableaux sont représentés par classe list(voir référence et ne pas les mélanger avec des générateurs ).

Découvrez des exemples d'utilisation:

# empty array
arr = [] 

# init with values (can contain mixed types)
arr = [1, "eels"]

# get item by index (can be negative to access end of array)
arr = [1, 2, 3, 4, 5, 6]
arr[0]  # 1
arr[-1] # 6

# get length
length = len(arr)

# supports append and insert
arr.append(8)
arr.insert(6, 7)

Réponse théorique

Sous le capot, Python listest un wrapper pour un vrai tableau qui contient des références aux éléments. En outre, le tableau sous-jacent est créé avec un espace supplémentaire.

Les conséquences de ceci sont:

  • l'accès aléatoire est vraiment bon marché ( arr[6653]c'est pareil pour arr[0])
  • append le fonctionnement est «gratuit» tandis que de l'espace supplémentaire
  • insert l'opération coûte cher

Consultez cette impressionnante table de complexité des opérations .

En outre, veuillez voir cette image, où j'ai essayé de montrer les différences les plus importantes entre le tableau, le tableau de références et la liste liée: tableaux, tableaux partout

Anton Purin
la source
5
Juste pour ajouter, il y a un moyen vraiment cool de couper des tableaux en python: pour le [1, 2, 3, 4, 5, 6, 7, 8, 9][1:-2]résultat sera[2, 3, 4, 5, 6, 7]
Anton Purin
2
Je vois de temps en temps des votes négatifs pour ce poste. Ce serait formidable si quelqu'un pouvait poster un mot pourquoi. Merci.
Anton Purin
2
Vous êtes un vrai MVP. Besoin de connaître la conception réelle de la «liste» afin de prendre des décisions de programmation raisonnables. Fondamentalement, c'est comme un «vecteur» en C ++. Merci!
Necro
Ceci est une vraie longue réponse avec une excellente explication!
Ahmed
Puis-je ajouter la notation pratique pour la comparaison, par exemple: a == b[:2]retourne True si les 2 premiers éléments de b sont égaux aux valeurs du tableau a
Bruno L.
124

Vous ne déclarez pas réellement les choses, mais voici comment vous créez un tableau en Python:

from array import array
intarray = array('i')

Pour plus d'informations, consultez le module tableau: http://docs.python.org/library/array.html

Maintenant, il est possible que vous ne vouliez pas d'un tableau, mais d'une liste, mais d'autres y ont déjà répondu. :)

Lennart Regebro
la source
10
C'est assez drôle, mais ce n'est pas vraiment une bonne réponse pour une question étiquetée "débutant". Juste pour être clair: en Python, vous utilisez généralement un type de données appelé a list. Python a un type de données à usage spécial appelé an arrayqui ressemble plus à un tableau C et est peu utilisé.
steveha
63
Non, mais tout le monde a déjà utilisé une liste. J'ai pensé que ce serait une bonne réponse pour souligner qu'il existe également des tableaux.
Lennart Regebro
8
accessoires super fous pour cette réponse. Je programme en Python depuis des années et je n'ai réalisé que récemment qu'il y avait un véritable objet tableau Python différent des objets de liste. Bien que la structure des données soit très similaire, les tableaux limitent le type d'objets que le tableau peut contenir. Grande réponse @LennartRegebro!
Josh Brown
4
Cela devrait être la bonne réponse Liste et tableaux sont deux choses différentes @LennartRegebro merci
Mina Gabriel
Il y a une raison spécifique pour laquelle vous pouvez utiliser des tableaux au lieu de listes. Plus précisément, si vous disposez d'un tableau appelé myarray plein de nombres, vous pouvez effectuer des opérations mathématiques contre celui-ci, et ces opérations sont appliquées à tous les éléments à l'intérieur de celui-ci. Donc, si vous exécutez myarray / 3, chaque nombre à l'intérieur est divisé par 3. Si vous essayez de faire la même chose avec une liste, vous obtiendrez une erreur. Ainsi, les tableaux sont plus efficaces pour les grands ensembles de données de nombres.
Matthew
66

Je pense que vous (vouliez) vouloir une liste avec les 30 premières cellules déjà remplies. Donc

   f = []

   for i in range(30):
       f.append(0)

Un exemple où cela pourrait être utilisé est dans la séquence de Fibonacci. Voir le problème 2 dans Project Euler

limitcracker
la source
96
C'est une façon plutôt baroque d'initialiser une liste. Essayez f = [0] * 30plutôt.
John Machin
N'est-ce pas la même chose qu'une plage = (10) de @slehar anwer? J'adore le python, sa syntaxe et son zen.
m3nda
@ erm3nda nope: $ python3 Python 3.4.2 [...] >>> a = range (10) >>> print (a) range (0, 10) >>>
arp
37

C'est ainsi:

my_array = [1, 'rebecca', 'allard', 15]
canadiancreed
la source
4
Comme ce n'est pas un tableau python mais une liste python, ne serait-il pas moins déroutant de l'appeler "ma_liste"?
Mattis Asp
4
Cela crée une liste, pas un tableau. Ils sont différents et ont des propriétés différentes en python. Plus précisément, vous pouvez effectuer des opérations numériques sur un tableau, mais pas sur une liste.
Matthew
21

Pour les calculs, utilisez des tableaux numpy comme celui-ci:

import numpy as np

a = np.ones((3,2))        # a 2D array with 3 rows, 2 columns, filled with ones
b = np.array([1,2,3])     # a 1D array initialised using a list [1,2,3]
c = np.linspace(2,3,100)  # an array with 100 points beteen (and including) 2 and 3

print(a*1.5)  # all elements of a times 1.5
print(a.T+b)  # b added to the transpose of a

ces tableaux numpy peuvent être enregistrés et chargés à partir du disque (même compressés) et les calculs complexes avec de grandes quantités d'éléments sont rapides en C.

Très utilisé dans les environnements scientifiques. Voir ici pour en savoir plus.

Rémi
la source
17

Le commentaire de JohnMachin devrait être la vraie réponse. À mon avis, toutes les autres réponses ne sont que des solutions de contournement! Donc:

array=[0]*element_count
csabinho
la source
se mettre d'accord. sauf attention à appeler même la variable "tableau", ou à obtenir la colère puriste. à cela, j'ajouterais également que vous pouvez également créer des "tableaux multidimensionnels":x=[[0] * 10] * 10
Peter S Magnusson
17

Quelques contributions ont suggéré que les tableaux en python sont représentés par des listes. Ceci est une erreur. Python a une implémentation indépendante de array()dans le module de bibliothèque standard array " array.array()", il est donc incorrect de confondre les deux. Les listes sont des listes en python donc soyez prudent avec la nomenclature utilisée.

list_01 = [4, 6.2, 7-2j, 'flo', 'cro']

list_01
Out[85]: [4, 6.2, (7-2j), 'flo', 'cro']

Il y a une différence très importante entre la liste et array.array(). Alors que ces deux objets sont des séquences ordonnées, array.array () est une séquence homogène ordonnée tandis qu'une liste est une séquence non homogène.

hussam
la source
16

Vous ne déclarez rien en Python. Vous l'utilisez simplement. Je vous recommande de commencer avec quelque chose comme http://diveintopython.net .

bayer
la source
2
Parfois, vous devez déclarer le type d'une variable: si vous ne l'utilisez pas auparavant, une structure de contrôle, elle n'existe pas en dehors de la structure de contrôle et vous construirez alors une nouvelle variable. L'hypothèse est alors que la variable est un entier, qui se heurte si vous l'utilisez comme un type plus complexe.
Plus clair le
@Clearer oui, l'utilisation de fonctions doit parfois le déclarer, et parfois jouer des globaux lors de l'utilisation de fonctions et ne veut pas écrire trop d'arguments sur les fonctions.
m3nda
Ce n'est pas seulement une fonction; une simple déclaration if pourrait vous poser le même problème.
Plus clair le
1
La programmation consiste à déclarer, peu importe la langue que vous utilisez. La déclaration de type est une toute autre histoire
Outside_Box
Bien que ce lien puisse répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et de fournir le lien de référence. Les réponses de lien uniquement peuvent devenir invalides si la page liée change.
Adrian Tompkins
13

Je ferais normalement ce a = [1,2,3]qui est en fait un listmais pour arraysregarder cette définition formelle

non séquenceur
la source
11

Pour ajouter à la réponse de Lennart, un tableau peut être créé comme ceci:

from array import array
float_array = array("f",values)

où les valeurs peuvent prendre la forme d'un tuple, d'une liste ou d'un np.array, mais pas d'un tableau:

values = [1,2,3]
values = (1,2,3)
values = np.array([1,2,3],'f')
# 'i' will work here too, but if array is 'i' then values have to be int
wrong_values = array('f',[1,2,3])
# TypeError: 'array.array' object is not callable

et la sortie sera toujours la même:

print(float_array)
print(float_array[1])
print(isinstance(float_array[1],float))

# array('f', [1.0, 2.0, 3.0])
# 2.0
# True

La plupart des méthodes de liste fonctionnent également avec array, les plus courantes étant pop (), extend () et append ().

À en juger par les réponses et les commentaires, il semble que la structure des données du tableau ne soit pas si populaire. Je l'aime cependant, de la même manière que l'on pourrait préférer un tuple à une liste.

La structure du tableau a des règles plus strictes qu'une liste ou np.array, ce qui peut réduire les erreurs et faciliter le débogage, en particulier lorsque vous travaillez avec des données numériques.

Les tentatives d'insertion / ajout d'un flottant dans un tableau int lèveront une TypeError:

values = [1,2,3]
int_array = array("i",values)
int_array.append(float(1))
# or int_array.extend([float(1)])

# TypeError: integer argument expected, got float

Garder des valeurs qui sont censées être des entiers (par exemple une liste d'index) sous la forme d'un tableau peut donc empêcher une "TypeError: les index de la liste doivent être des entiers, pas des flottants", car les tableaux peuvent être itérés, comme np.array et lists:

int_array = array('i',[1,2,3])
data = [11,22,33,44,55]
sample = []
for i in int_array:
    sample.append(data[i])

De façon ennuyeuse, l'ajout d'un int à un tableau flottant entraînera l'int int devenir un flottant, sans lever une exception.

np.array conserve également le même type de données pour ses entrées, mais au lieu de donner une erreur, il changera son type de données pour s'adapter aux nouvelles entrées (généralement en double ou en str):

import numpy as np
numpy_int_array = np.array([1,2,3],'i')
for i in numpy_int_array:
    print(type(i))
    # <class 'numpy.int32'>
numpy_int_array_2 = np.append(numpy_int_array,int(1))
# still <class 'numpy.int32'>
numpy_float_array = np.append(numpy_int_array,float(1))
# <class 'numpy.float64'> for all values
numpy_str_array = np.append(numpy_int_array,"1")
# <class 'numpy.str_'> for all values
data = [11,22,33,44,55]
sample = []
for i in numpy_int_array_2:
    sample.append(data[i])
    # no problem here, but TypeError for the other two

Cela est également vrai lors de l'affectation. Si le type de données est spécifié, np.array transformera, dans la mesure du possible, les entrées en ce type de données:

int_numpy_array = np.array([1,2,float(3)],'i')
# 3 becomes an int
int_numpy_array_2 = np.array([1,2,3.9],'i')
# 3.9 gets truncated to 3 (same as int(3.9))
invalid_array = np.array([1,2,"string"],'i')
# ValueError: invalid literal for int() with base 10: 'string'
# Same error as int('string')
str_numpy_array = np.array([1,2,3],'str')
print(str_numpy_array)
print([type(i) for i in str_numpy_array])
# ['1' '2' '3']
# <class 'numpy.str_'>

ou, en substance:

data = [1.2,3.4,5.6]
list_1 = np.array(data,'i').tolist()
list_2 = [int(i) for i in data]
print(list_1 == list_2)
# True

tandis que le tableau donnera simplement:

invalid_array = array([1,2,3.9],'i')
# TypeError: integer argument expected, got float

Pour cette raison, ce n'est pas une bonne idée d'utiliser np.array pour les commandes spécifiques au type. La structure du tableau est utile ici. La liste conserve le type de données des valeurs.

Et pour quelque chose que je trouve plutôt embêtant: le type de données est spécifié comme premier argument dans array (), mais (généralement) le second dans np.array (). : |

La relation avec C est référencée ici: Python List vs. Array - quand l'utiliser?

Amusez-vous à explorer!

Remarque: La nature typée et plutôt stricte du tableau penche davantage vers C que vers Python, et par conception Python n'a pas beaucoup de contraintes spécifiques au type dans ses fonctions. Son impopularité crée également une rétroaction positive dans le travail collaboratif, et le remplacer implique principalement un [int (x) pour x dans le fichier] supplémentaire. Il est donc tout à fait viable et raisonnable d'ignorer l'existence d'un tableau. Cela ne devrait en aucun cas gêner la plupart d'entre nous. :RÉ

Melvin
la source
8

Que dis-tu de ça...

>>> a = range(12)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
>>> a[7]
6
slehar
la source
6

Python les appelle des listes . Vous pouvez écrire un littéral de liste avec des crochets et des virgules:

>>> [6,28,496,8128]
[6, 28, 496, 8128]
Colonel Panic
la source
5

Dans la continuité de Lennart, il existe également numpy qui implémente des tableaux multidimensionnels homogènes.

camh
la source
4

J'avais un tableau de chaînes et j'avais besoin d'un tableau de la même longueur de booléens initié à True. C'est ce que j'ai fait

strs = ["Hi","Bye"] 
bools = [ True for s in strs ]
Pedro A. Aranda
la source
Je suis ici parce que je voulais la déclaration C: int count[26]={0}; il y a probablement une meilleure façon mais cette variante de boolsci-dessus a fonctionné plus count=[0 for ii in range(26)]tard, je l'ai ensuite changée en ce count=[0]*26qui semble préférable.
user1683793
2

Vous pouvez créer des listes et les convertir en tableaux ou vous pouvez créer un tableau à l'aide du module numpy. Voici quelques exemples pour illustrer la même chose. Numpy facilite également le travail avec des tableaux multidimensionnels.

import numpy as np
a = np.array([1, 2, 3, 4])

#For custom inputs
a = np.array([int(x) for x in input().split()])

Vous pouvez également remodeler ce tableau en une matrice 2X2 en utilisant la fonction de remodelage qui prend en entrée les dimensions de la matrice.

mat = a.reshape(2, 2)
Amit Prafulla
la source