web-dev-qa-db-fra.com

Comment déclarer un tableau en Python?

Comment déclarer un tableau dans Python ?

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

430
pynewbie
variable = []

Maintenant, variable fait référence à une liste vide*.

Bien sûr, il s’agit d’une cession et non d’une déclaration. Il n’ya aucun moyen de dire dans Python "cette variable ne doit jamais faire référence à autre chose qu’une liste", car Python est typé de manière dynamique.


*Le type Python intégré par défaut est appelé une liste et non un tableau. C'est un conteneur ordonné de longueur arbitraire qui peut contenir une collection hétérogène d'objets (leurs types importent peu et peuvent être librement mélangés). Ceci ne doit pas être confondu avec le array module , qui offre un type plus proche du type C array; le contenu doit être homogène (tous du même type), mais la longueur est toujours dynamique.

323
sepp2k

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, voir le module tableau: http://docs.python.org/library/array.html

Maintenant possible, vous ne voulez pas un tableau, mais une liste, mais d'autres ont déjà répondu à cette question. :)

118
Lennart Regebro

C'est un sujet étonnamment complexe en Python.

Réponse pratique

Les tableaux sont représentés par la classe list (voir référence et ne les mélangez pas avec 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 list est un wrapper pour un tableau réel contenant des références à des é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] est identique à arr[0])
  • append l'opération est 'gratuite' tandis que de l'espace supplémentaire
  • insert l'opération est chère

Vérifiez ceci tableau impressionnant de complexité des opérations .

Aussi, s'il vous plaît voir cette image, où j'ai essayé de montrer les différences les plus importantes entre tableau, tableau de références et liste chaînée: arrays, arrays everywhere

110
Anton Purin

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

   f = []

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

Un exemple d'utilisation de cette option est la séquence de Fibonacci. Voir le problème 2 dans Project Euler

65
limitcracker

C'est ainsi:

my_array = [1, 'rebecca', 'allard', 15]
36
canadiancreed

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

16
bayer

Quelques contributions ont suggéré que les tableaux de python soient 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 dans python, soyez donc 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 existe une différence très importante entre list et array.array(). Alors que ces deux objets sont des séquences ordonnées, array.array () est une séquence homogène ordonnée alors qu'une liste est une séquence non homogène.

16
hussam

Je ferais normalement juste a = [1,2,3] qui est en fait un list mais pour arrays regardez ce formel définition

13
non sequitor

pour les calculs, utilisez numpy des tableaux 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 sauvegardé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. Très utilisé dans les environnements scientifiques. Voir ici pour plus ...

13
Remi

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

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

les valeurs peuvent prendre la forme d'un tuple, d'une liste ou d'un np.array, mais pas de 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 le résultat sera toujours le 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 pour list fonctionnent également avec array, les plus courantes étant pop (), extend () et append ().

À en juger par les réponses et les commentaires, il apparaît que la structure de données du tableau n’est pas si populaire. Je l’aime bien, tout comme 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/d’ajout de float à un tableau int généreront une erreur 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

Conserver les valeurs qui sont censées être des entiers (par exemple, une liste d’indexes) dans un tableau peut donc empêcher une "TypeError: les index de liste doivent être des entiers, et non des objets à virgule flottante", car les tableaux peuvent être itérés, de la même façon que np.array et les listes:

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

De manière ennuyeuse, ajouter un int à un tableau float le fera devenir un float, sans générer d'exception.

np.array conserve le même type de données pour ses entrées, mais au lieu de donner une erreur, il modifiera son type de données pour s’adapter aux nouvelles entrées (généralement double ou 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 vrai également 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 array donnera simplement:

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

Pour cette raison, l'utilisation de np.array pour les commandes spécifiques au type n'est pas une bonne idée. 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é en tant que premier argument dans array (), mais (généralement) le second dans np.array (). : |

On se réfère ici à la relation avec C: Liste Python vs Array - Quand utiliser?

Amusez-vous à explorer!

Remarque: La nature typée et plutôt stricte de array s'appuie davantage sur le C que sur Python, et de par sa conception, Python n'a pas beaucoup de contraintes spécifiques au type dans ses fonctions. Son impopularité crée également un retour positif dans le travail collaboratif, et son remplacement implique généralement un complément de [int (x) pour x dans fichier]. Il est donc tout à fait viable et raisonnable d’ignorer l’existence de array. Cela ne devrait en aucun cas gêner la plupart d'entre nous. :RÉ

11
Melvin

Que dis-tu de ça...

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

commentaire de JohnMachin devrait être la vraie réponse. Toutes les autres réponses ne sont que des solutions de contournement à mon avis! Alors:

array=[0]*element_count
7
csabinho

Après Lennart, il y a aussi numpy qui implémente des tableaux multidimensionnels homogènes.

6
camh

Python les appelle listes . Vous pouvez écrire une liste littérale avec des crochets et des crochets:

>>> [6,28,496,8128]
[6, 28, 496, 8128]
6
Colonel Panic

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 ]
4
Pedro A. Aranda

Vous pouvez créer des listes et les convertir en tableaux ou vous pouvez créer un tableau en utilisant le module numpy. Vous trouverez ci-dessous 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 transformer ce tableau en une matrice 2X2 à l'aide de la fonction reshape qui prend en entrée les dimensions de la matrice.

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