Por alguma razão insondável, o Python chama matrizes de "listas". A escola de design de idiomas "todo mundo sabe o que é isso que se chama assim que vamos chamar de algo mais". É uma escolha de nome particularmente ruim, pois parece uma lista vinculada e não uma matriz.
Glenn Maynard
42
@ Glenn Maynard: provavelmente porque em linguagens tipo C as matrizes são de tamanho fixo, enquanto as listas Python não. É mais como o vetor STL em C ++ ou ArrayList em Java.
MAK
128
É chamado de lista, porque é uma lista. [A (), 1, 'Foo', u'öäöäö ', 67L, 5,6]. Uma lista. Uma matriz é "um arranjo de itens em endereços igualmente espaçados na memória do computador" (wikipedia).
Lennart Regebro 03/10/2009
35
Nada sobre o termo universalmente entendido "matriz" sugere um comprimento fixo ou qualquer coisa sobre o conteúdo; essas são apenas limitações da implementação específica de matrizes de C. As listas Python são igualmente espaçadas (ponteiros para objetos, internamente), ou então __getitem__não seriam O (1).
Glenn Maynard
24
@Glenn, de en.wikipedia.org/wiki/Array_data_structure: "os elementos de uma estrutura de dados de matriz precisam ter o mesmo tamanho" (verdadeiro para matrizes de Python, não verdadeiro para listas de Python) e "conjunto de tuplas de índice válidas e os endereços dos elementos (e, portanto, a fórmula de endereçamento dos elementos) geralmente são fixos enquanto a matriz está em uso "(não é verdade no Python para lista ou matriz).
287 Alex Martelli
Respostas:
358
variable =[]
Agora variablese refere a uma lista vazia * .
Claro que isso é uma tarefa, não uma declaração. Não há como dizer no Python "essa variável nunca deve se referir a nada além de uma lista", pois o Python é digitado dinamicamente.
* O tipo Python interno padrão é chamado de lista , não uma matriz. É um contêiner ordenado de comprimento arbitrário que pode conter uma coleção heterogênea de objetos (seus tipos não importam e podem ser livremente misturados). Isso não deve ser confundido com o arraymódulo , que oferece um tipo mais próximo do arraytipo C ; o conteúdo deve ser homogêneo (do mesmo tipo), mas o comprimento ainda é dinâmico.
Seria possível inicializar o conteúdo da matriz, como no JavaScript? (por exemplo, como variable = ["Hi", "Hello"];?)
Anderson Green
6
@AndersonGreen Sim.
sepp2k
3
Como você declarar uma matriz multidimensional, em seguida, (por exemplo, uma matriz 2D?)
Anderson Verde
7
@AndersonGreen Como eu disse, não existe uma declaração de variável em Python. Você poderia criar uma lista multidimensional, tendo uma lista vazia e colocando outras listas no seu interior ou, se as dimensões da lista são conhecidos no write-tempo, você poderia apenas escrevê-lo como um literal como este: my_2x2_list = [[a, b], [c, d]]. Dependendo do que você precisa de matrizes multidimensionais, você também pode considerar o uso numpy, que define os tipos de matrizes para matrizes multidimensionais, homogêneas e sem caixa, que podem ser muito mais eficientes quando aplicável, portanto, são preferíveis para cálculos numéricos.
sepp2k
1
@IfanIqbal Sim, se contiver pelo menos um elemento, você poderá.
sepp2k
136
Este é um tópico surpreendentemente complexo em Python.
Resposta prática
Matrizes são representadas por classe list(consulte a referência e não as misture com geradores ).
Confira exemplos de uso:
# 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)
Resposta teórica
Sob o capô, o Python's listé um invólucro para uma matriz real que contém referências a itens. Além disso, a matriz subjacente é criada com algum espaço extra.
As consequências disso são:
acesso aleatório é muito barato ( arr[6653]é o mesmo que arr[0])
append operação é "de graça", enquanto algum espaço extra
Só para acrescentar, há uma maneira muito legal de matrizes de corte em python: para [1, 2, 3, 4, 5, 6, 7, 8, 9][1:-2]resultado será[2, 3, 4, 5, 6, 7]
Anton Purin
2
Vejo alguns votos negativos para este post de tempos em tempos. Seria ótimo se alguém pudesse postar uma palavra do porquê. Obrigado.
Anton Purin
2
Você é um verdadeiro MVP. É necessário conhecer o design real escolhido da 'lista' para tomar decisões de programação razoáveis. Basicamente, é como um 'vetor' em C ++. Obrigado!
Necro
Esta é uma resposta muito longa, com uma ótima explicação!
Ahmed
Posso adicionar a notação prática para comparação, por exemplo: a == b[:2]retorna True se os 2 primeiros elementos de b forem iguais aos valores da matriz a
Bruno L.
124
Na verdade, você não declara as coisas, mas é assim que você cria uma matriz no Python:
Isso é meio engraçado, mas não é realmente uma boa resposta para uma pergunta marcada como "iniciante". Apenas para esclarecer: no Python você costuma usar um tipo de dados chamado a list. O Python possui um tipo de dados para fins especiais chamado an, arrayque se parece mais com uma matriz C e é pouco usado.
Steveha 4/10/09
63
Não, mas todo mundo já usou uma lista. Eu pensei que seria uma boa resposta ressaltar que também existem matrizes.
Lennart Regebro 04/10/2009
8
adereços super loucos para esta resposta. Venho programando em Python há anos e só recentemente percebi que havia um objeto de matriz Python real que é diferente dos objetos de lista. Embora a estrutura de dados seja muito semelhante, as matrizes limitam que tipo de objetos a matriz pode conter. Ótima resposta @LennartRegebro!
21415 Josh Brown
4
Esta deve ser a Lista resposta certa e Arrays são duas coisas diferentes @LennartRegebro graças
Mina Gabriel
Há um motivo específico para você querer usar matrizes em vez de listas. Especificamente, se você tiver uma matriz chamada myarray cheia de números, poderá executar operações matemáticas contra ela, e essas operações serão aplicadas a todos os itens dentro dela. Portanto, se você executar myarray / 3, todo número interno será dividido por 3. Se você tentar fazer o mesmo com uma lista, receberá um erro. Portanto, matrizes são mais eficientes para grandes conjuntos de dados de números.
Matthew
66
Eu acho que você quer dizer uma lista com as 30 primeiras células já preenchidas. assim
f =[]for i in range(30):
f.append(0)
Um exemplo de onde isso poderia ser usado está na sequência de Fibonacci. Veja o problema 2 no Projeto Euler
Como essa não é uma matriz python, mas uma lista python, não seria menos confuso chamá-la "my_list"?
Mattis Asp
4
Isso cria uma lista, não uma matriz. Eles são diferentes e têm propriedades diferentes em python. Especificamente, você pode executar operações numéricas em uma matriz, mas não em uma lista.
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 3print(a*1.5)# all elements of a times 1.5print(a.T+b)# b added to the transpose of a
essas matrizes numpy podem ser salvas e carregadas do disco (mesmo compactadas) e cálculos complexos com grandes quantidades de elementos são rápidos como C.
Muito usado em ambientes científicos. Veja aqui para mais.
aceita. exceto o cuidado de chamar até a variável "array" ou obter ira purista. para isso eu também acrescentaria que você também pode criar "matrizes multidimensionais":x=[[0] * 10] * 10
Peter S Magnusson
17
Algumas contribuições sugeriram que matrizes em python são representadas por listas. Isto está incorreto. O Python possui uma implementação independente array()no array " array.array()" módulo de biblioteca padrão, portanto, é incorreto confundir os dois. As listas são listas em python, portanto, tenha cuidado com a nomenclatura usada.
Há uma diferença muito importante entre lista e array.array(). Enquanto esses dois objetos são seqüências ordenadas, array.array () é uma sequência homogênea ordenada, enquanto uma lista é uma sequência não homogênea.
Algumas vezes você deve declarar o tipo de uma variável: se você não a usa antes, uma estrutura de controle, ela não existe fora da estrutura de controle e você estará construindo uma nova variável. A suposição é que a variável é um int, que entra em conflito se você a usar como um tipo mais complexo.
mais claro
@ Clearer sim, o uso de funções às vezes precisa declará-lo e, às vezes, reproduzir alguns globais ao usar funções e não quero escrever muitos argumentos sobre as funções.
M3nda
Não é apenas função; uma simples declaração if poderia lhe dar o mesmo problema.
Clearer
1
Programar é sobre declarar, não importa qual idioma você usa. Tipo declarar é uma história completamente diferente
Outside_Box 15/08/18
Embora esse link possa responder à pergunta, é melhor incluir aqui as partes essenciais da resposta e fornecer o link para referência. As respostas somente para links podem se tornar inválidas se a página vinculada for alterada.
Adrian Tompkins
13
Normalmente, eu faria apenas o a = [1,2,3]que é realmente um, listmas arraysolhe para esta definição formal
Para adicionar à resposta de Lennart, uma matriz pode ser criada assim:
from array import array
float_array = array("f",values)
onde os valores podem assumir a forma de uma tupla, lista ou np.array, mas não uma matriz:
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
A maioria dos métodos de lista também funciona com array, sendo os comuns pop (), extend () e append ().
A julgar pelas respostas e comentários, parece que a estrutura de dados da matriz não é tão popular. Eu gosto, porém, da mesma maneira que se pode preferir uma tupla a uma lista.
A estrutura da matriz possui regras mais rígidas que uma lista ou np.array, e isso pode reduzir erros e facilitar a depuração, especialmente ao trabalhar com dados numéricos.
Tentativas de inserir / acrescentar um ponto flutuante a uma matriz int lançarão um TypeError:
Manter valores que devem ser números inteiros (por exemplo, lista de índices) no formato de matriz pode, portanto, impedir um "TypeError: os índices de lista devem ser números inteiros, não flutuantes", pois as matrizes podem ser iteradas, semelhante a np.array e lists:
int_array = array('i',[1,2,3])
data =[11,22,33,44,55]
sample =[]for i in int_array:
sample.append(data[i])
Irritantemente, anexar um int a uma matriz flutuante fará com que o int se torne um flutuante, sem gerar uma exceção.
O np.array também retém o mesmo tipo de dados para suas entradas, mas em vez de dar um erro, ele mudará seu tipo de dados para ajustar novas entradas (geralmente para 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
Isso também ocorre durante a atribuição. Se o tipo de dados for especificado, o np.array, sempre que possível, transformará as entradas nesse tipo de dados:
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, em essência:
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
Por esse motivo, não é uma boa ideia usar o np.array para comandos específicos de tipo. A estrutura da matriz é útil aqui. lista preserva o tipo de dados dos valores.
E para algo que eu acho bastante incômodo: o tipo de dados é especificado como o primeiro argumento em array (), mas (geralmente) o segundo em np.array (). : |
Nota: A natureza tipificada e estrita da matriz se inclina mais para C do que para Python, e por design o Python não possui muitas restrições específicas de tipo em suas funções. Sua impopularidade também cria um feedback positivo no trabalho colaborativo, e sua substituição envolve principalmente um [int (x) adicional para x no arquivo]. Portanto, é inteiramente viável e razoável ignorar a existência de matriz. Isso não deve atrapalhar a maioria de nós de forma alguma. : D
Estou aqui porque queria a declaração C: int count[26]={0}; provavelmente existe uma maneira melhor, mas essa variante boolsacima funcionou. count=[0 for ii in range(26)]Depois, mudei para a count=[0]*26que parece preferível.
usar o seguinte comando
2
Você pode criar listas e convertê-las em matrizes ou criar matriz usando o módulo numpy. Abaixo estão alguns exemplos para ilustrar o mesmo. O Numpy também facilita o trabalho com matrizes multidimensionais.
import numpy as np
a = np.array([1,2,3,4])#For custom inputs
a = np.array([int(x)for x in input().split()])
Você também pode remodelar essa matriz em uma matriz 2X2 usando a função remodelar, que recebe entradas como as dimensões da matriz.
__getitem__
não seriam O (1).Respostas:
Agora
variable
se refere a uma lista vazia * .Claro que isso é uma tarefa, não uma declaração. Não há como dizer no Python "essa variável nunca deve se referir a nada além de uma lista", pois o Python é digitado dinamicamente.
* O tipo Python interno padrão é chamado de lista , não uma matriz. É um contêiner ordenado de comprimento arbitrário que pode conter uma coleção heterogênea de objetos (seus tipos não importam e podem ser livremente misturados). Isso não deve ser confundido com o
array
módulo , que oferece um tipo mais próximo doarray
tipo C ; o conteúdo deve ser homogêneo (do mesmo tipo), mas o comprimento ainda é dinâmico.fonte
variable = ["Hi", "Hello"];
?)my_2x2_list = [[a, b], [c, d]]
. Dependendo do que você precisa de matrizes multidimensionais, você também pode considerar o usonumpy
, que define os tipos de matrizes para matrizes multidimensionais, homogêneas e sem caixa, que podem ser muito mais eficientes quando aplicável, portanto, são preferíveis para cálculos numéricos.Este é um tópico surpreendentemente complexo em Python.
Resposta prática
Matrizes são representadas por classe
list
(consulte a referência e não as misture com geradores ).Confira exemplos de uso:
Resposta teórica
Sob o capô, o Python's
list
é um invólucro para uma matriz real que contém referências a itens. Além disso, a matriz subjacente é criada com algum espaço extra.As consequências disso são:
arr[6653]
é o mesmo quearr[0]
)append
operação é "de graça", enquanto algum espaço extrainsert
operação é caraVerifique esta impressionante tabela de complexidade de operações .
Além disso, veja esta imagem, onde tentei mostrar as diferenças mais importantes entre matriz, matriz de referências e lista vinculada:
fonte
[1, 2, 3, 4, 5, 6, 7, 8, 9][1:-2]
resultado será[2, 3, 4, 5, 6, 7]
a == b[:2]
retorna True se os 2 primeiros elementos de b forem iguais aos valores da matriz aNa verdade, você não declara as coisas, mas é assim que você cria uma matriz no Python:
Para mais informações, consulte o módulo de matriz: http://docs.python.org/library/array.html
Agora é possível que você não queira uma matriz, mas uma lista, mas outras pessoas já responderam isso. :)
fonte
list
. O Python possui um tipo de dados para fins especiais chamado an,array
que se parece mais com uma matriz C e é pouco usado.Eu acho que você quer dizer uma lista com as 30 primeiras células já preenchidas. assim
Um exemplo de onde isso poderia ser usado está na sequência de Fibonacci. Veja o problema 2 no Projeto Euler
fonte
f = [0] * 30
vez disso.É assim:
fonte
Para cálculos, use matrizes numpy como este:
essas matrizes numpy podem ser salvas e carregadas do disco (mesmo compactadas) e cálculos complexos com grandes quantidades de elementos são rápidos como C.
Muito usado em ambientes científicos. Veja aqui para mais.
fonte
O comentário de JohnMachin deve ser a resposta real. Todas as outras respostas são apenas soluções alternativas na minha opinião! Assim:
fonte
x=[[0] * 10] * 10
Algumas contribuições sugeriram que matrizes em python são representadas por listas. Isto está incorreto. O Python possui uma implementação independente
array()
noarray
"array.array()
" módulo de biblioteca padrão, portanto, é incorreto confundir os dois. As listas são listas em python, portanto, tenha cuidado com a nomenclatura usada.Há uma diferença muito importante entre lista e
array.array()
. Enquanto esses dois objetos são seqüências ordenadas, array.array () é uma sequência homogênea ordenada, enquanto uma lista é uma sequência não homogênea.fonte
Você não declara nada no Python. Você apenas usa. Eu recomendo que você comece com algo como http://diveintopython.net .
fonte
Normalmente, eu faria apenas o
a = [1,2,3]
que é realmente um,list
masarrays
olhe para esta definição formalfonte
Para adicionar à resposta de Lennart, uma matriz pode ser criada assim:
onde os valores podem assumir a forma de uma tupla, lista ou np.array, mas não uma matriz:
e a saída ainda será a mesma:
A maioria dos métodos de lista também funciona com array, sendo os comuns pop (), extend () e append ().
A julgar pelas respostas e comentários, parece que a estrutura de dados da matriz não é tão popular. Eu gosto, porém, da mesma maneira que se pode preferir uma tupla a uma lista.
A estrutura da matriz possui regras mais rígidas que uma lista ou np.array, e isso pode reduzir erros e facilitar a depuração, especialmente ao trabalhar com dados numéricos.
Tentativas de inserir / acrescentar um ponto flutuante a uma matriz int lançarão um TypeError:
Manter valores que devem ser números inteiros (por exemplo, lista de índices) no formato de matriz pode, portanto, impedir um "TypeError: os índices de lista devem ser números inteiros, não flutuantes", pois as matrizes podem ser iteradas, semelhante a np.array e lists:
Irritantemente, anexar um int a uma matriz flutuante fará com que o int se torne um flutuante, sem gerar uma exceção.
O np.array também retém o mesmo tipo de dados para suas entradas, mas em vez de dar um erro, ele mudará seu tipo de dados para ajustar novas entradas (geralmente para double ou str):
Isso também ocorre durante a atribuição. Se o tipo de dados for especificado, o np.array, sempre que possível, transformará as entradas nesse tipo de dados:
ou, em essência:
enquanto array simplesmente dará:
Por esse motivo, não é uma boa ideia usar o np.array para comandos específicos de tipo. A estrutura da matriz é útil aqui. lista preserva o tipo de dados dos valores.
E para algo que eu acho bastante incômodo: o tipo de dados é especificado como o primeiro argumento em array (), mas (geralmente) o segundo em np.array (). : |
A relação com C é referida aqui: Lista Python vs. Matriz - quando usar?
Divirta-se explorando!
Nota: A natureza tipificada e estrita da matriz se inclina mais para C do que para Python, e por design o Python não possui muitas restrições específicas de tipo em suas funções. Sua impopularidade também cria um feedback positivo no trabalho colaborativo, e sua substituição envolve principalmente um [int (x) adicional para x no arquivo]. Portanto, é inteiramente viável e razoável ignorar a existência de matriz. Isso não deve atrapalhar a maioria de nós de forma alguma. : D
fonte
Que tal agora...
fonte
Python os chama de listas . Você pode escrever uma lista literal entre colchetes e vírgulas:
fonte
Na sequência do Lennart, há também numpy que implementa homogêneos matrizes multi-dimensionais.
fonte
Eu tinha uma matriz de seqüências de caracteres e precisava de uma matriz do mesmo comprimento de booleanos iniciados em True. Foi o que eu fiz
fonte
int count[26]={0};
provavelmente existe uma maneira melhor, mas essa variantebools
acima funcionou.count=[0 for ii in range(26)]
Depois, mudei para acount=[0]*26
que parece preferível.Você pode criar listas e convertê-las em matrizes ou criar matriz usando o módulo numpy. Abaixo estão alguns exemplos para ilustrar o mesmo. O Numpy também facilita o trabalho com matrizes multidimensionais.
Você também pode remodelar essa matriz em uma matriz 2X2 usando a função remodelar, que recebe entradas como as dimensões da matriz.
fonte