파이썬에서 배열을 선언하는 방법?


490

파이썬 에서 배열을 어떻게 선언 합니까?

설명서에서 배열에 대한 참조를 찾을 수 없습니다.


121
헤아릴 수없는 이유로, 파이썬은 배열을 "목록"이라고 부릅니다. 언어 디자인의 "모든 사람들이 알고있는 것, 이것이 소위 말하는 것입니다." 배열이 아닌 연결된 목록처럼 보이기 때문에 특히 이름을 잘못 선택합니다.
Glenn Maynard

42
@Glenn Maynard : 아마도 C와 같은 언어에서는 배열의 길이가 고정되어 있지만 파이썬리스트는 그렇지 않기 때문입니다. C ++의 STL 벡터 또는 Java의 ArrayList와 비슷합니다.
MAK

128
목록이기 때문에 목록이라고합니다. [A (), 1, 'Foo', u'öäöäö ', 67L, 5.6]. 목록. 배열은 "컴퓨터 메모리에서 동일한 간격으로 주소가 지정된 항목 배열"(wikipedia)입니다.
Lennart Regebro

35
보편적으로 이해되는 용어 "배열"은 내용에 대해 고정 길이 또는 그 어떤 것도 제안하지 않습니다. 이는 C의 특정 배열 구현에 대한 제한 사항입니다. 파이썬리스트는 같은 간격 (객체를 가리키는 포인터)이거나 그렇지 __getitem__않으면 O (1)이 아닙니다.
Glenn Maynard

24
@Glenn, en.wikipedia.org/wiki/Array_data_structure : "배열 데이터 구조의 요소는 같은 크기를 가져야합니다."(Python의 경우는 아니지만 Python의 경우는 true) 및 "유효한 인덱스 튜플 세트는 요소의 주소 (따라서 요소 주소 지정 수식)는 일반적으로 배열이 사용되는 동안 고정됩니다 "
Alex Martelli

답변:


358
variable = []

이제 variable빈 목록 *을 참조하십시오 .

물론 이것은 선언이 아니라 과제입니다. 파이썬은 동적으로 타입이 지정되기 때문에 파이썬에서 "이 변수는리스트 이외의 것을 가리켜서는 안됩니다"라고 말할 방법이 없습니다.


* 기본 내장 파이썬 타입을 배열이 아닌 list 라고합니다 . 이질적인 객체 컬렉션을 보유 할 수있는 임의 길이의 정렬 된 컨테이너입니다 (유형은 중요하지 않고 자유롭게 혼합 할 수 있음). 이것은 C 유형에 더 가까운 유형을 제공하는 array모듈 과 혼동되어서는 안됩니다 array. 내용은 동일해야하며 (동일한 유형) 길이는 여전히 동적입니다.


11
JavaScript에서와 같이 배열의 내용을 초기화 할 수 있습니까? (예 : variable = ["Hi", "Hello"];?)
Anderson Green

6
@AndersonGreen 예.
sepp2k

3
다차원 배열을 어떻게 선언하겠습니까 (예 : 2D 배열?)
Anderson Green

7
@AndersonGreen 내가 말했듯이 파이썬에는 변수 선언과 같은 것이 없습니다. 빈 목록을 가져와 다른 목록을 넣어 다차원 목록을 만들거나, 기록시 목록의 크기를 알고 있으면 다음과 같이 리터럴로 작성할 수 있습니다 my_2x2_list = [[a, b], [c, d]]. 다차원 배열이 필요한 것에 따라을 사용하는 것도 고려할 numpy수 있습니다.
sepp2k

1
@IfanIqbal 예, 하나 이상의 요소가 포함 된 경우 가능합니다.
sepp2k

136

이것은 파이썬에서 놀랍도록 복잡한 주제입니다.

실용 답변

배열은 클래스로 표시됩니다 list(참조 참조generator 와 혼합하지 마십시오 ).

사용 예를 확인하십시오.

# 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)

이론적 답변

기본적으로 파이썬 list은 항목에 대한 참조를 포함하는 실제 배열의 래퍼입니다. 또한 기본 배열은 약간의 추가 공간으로 생성됩니다.

이것의 결과는 다음과 같습니다.

  • 랜덤 액세스는 정말 저렴합니다 ( arr[6653]와 동일 arr[0])
  • append 추가 공간이있는 동안 작업은 '무료'입니다
  • insert 작업이 비싸다

멋진 작업 테이블 복잡성을 확인하십시오 .

또한이 그림을 참조하십시오. 여기서 배열, 참조 배열 및 링크 된 목록 간의 가장 중요한 차이점을 보여 주려고했습니다. 배열, 어디서나 배열


5
간단히 [1, 2, 3, 4, 5, 6, 7, 8, 9][1:-2][2, 3, 4, 5, 6, 7]
말해서

2
이 게시물에 대한 일부 다운 투표가 표시됩니다. 누군가가 왜 단어를 게시 할 수 있다면 좋을 것입니다. 감사.
Anton Purin

2
당신은 진짜 MVP입니다. 합리적인 프로그래밍 결정을 내리기 위해 실제로 선택된 '목록'디자인을 알아야합니다. 기본적으로 C ++의 '벡터'와 같습니다. 감사!
Necro

이것은 훌륭한 설명이 담긴 진정한 대답입니다!
Ahmed

비교를위한 실용적인 표기법을 추가 할 수 있습니다. 예를 들어, ba == b[:2] 의 처음 두 요소 가 배열 a 의 값과 같으면 True를 반환 합니다.
Bruno L.

124

실제로 선언하지는 않지만 파이썬에서 배열을 만드는 방법입니다.

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

자세한 내용은 배열 모듈을 참조하십시오 : http://docs.python.org/library/array.html

이제 배열을 원하지 않고 목록을 원하지만 다른 사람들이 이미 대답했습니다. :)


10
이것은 재미 있지만 "초보자"라는 질문에 대한 답은 아닙니다. 분명히하기 위해 : Python에서는 일반적으로 a라는 데이터 유형을 사용합니다 list. 파이썬은 arrayC 배열과 비슷하고 거의 사용되지 않는 특별한 목적의 데이터 유형을 가지고 있습니다.
steveha

63
아니요,하지만 다른 사람들은 이미 목록을 사용했습니다. 배열도 있음을 지적하는 것이 좋은 대답이라고 생각했습니다.
Lennart Regebro

8
이 답변에 대한 슈퍼 미친 소품. 나는 몇 년 동안 파이썬으로 프로그래밍 해 왔으며 최근에 목록 객체와 다른 실제 파이썬 배열 객체가 있음을 깨달았습니다. 데이터 구조는 매우 유사하지만 배열은 배열이 보유 할 수있는 객체 유형을 제한합니다. 좋은 답변 @LennartRegebro!
Josh Brown

4
정답입니다 목록과 배열은 @LennartRegebro 감사합니다
Mina Gabriel

목록 대신 배열을 사용하려는 특별한 이유가 있습니다. 특히, 숫자로 가득 찬 myarray라는 배열이 있으면 그에 대해 수학 연산을 수행 할 수 있으며 해당 연산은 그 안의 모든 항목에 적용됩니다. 따라서 myarray / 3을 실행하면 내부의 모든 숫자가 3으로 나뉩니다. 목록으로 동일한 작업을 시도하면 오류가 발생합니다. 따라서 배열은 많은 수의 데이터 집합에 더 효율적입니다.
Matthew

66

처음 30 개의 셀이 이미 채워진 목록을 원한다고 생각합니다. 그래서

   f = []

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

이것을 사용할 수있는 예는 피보나치 순서입니다. 프로젝트 오일러의 문제 2 참조


96
그것은 목록을 초기화하는 다소 빠른 방법입니다. f = [0] * 30대신 시도하십시오 .
John Machin

@slehar anwer의 a = range (10)와 같지 않습니까? python을 좋아합니다. 구문과 Zen입니다.
m3nda 2016 년

@ erm3nda nope : $ python3 Python 3.4.2 [...] >>> a = range (10) >>> print (a) range (0, 10) >>>
arp

37

방법은 다음과 같습니다.

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

4
이것은 파이썬 배열이 아니라 파이썬 목록이기 때문에 "my_list"라고 부르는 것이 덜 혼란스럽지 않습니까?
Mattis Asp

4
배열이 아닌 목록을 만듭니다. 그들은 파이썬에서 다르며 다른 속성을 가지고 있습니다. 특히 배열에 대해서는 수치 연산을 수행 할 수 있지만 목록에는 대해서는 수행 할 수 없습니다.
Matthew

21

계산을 위해 다음 과 같이 numpy 배열을 사용 하십시오.

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

이 numpy 배열은 디스크에서 저장 및로드 할 수 있으며 (압축 된 경우에도) 대량의 요소를 사용한 복잡한 계산은 C와 비슷합니다.

과학적인 환경에서 많이 사용됩니다. 자세한 내용은 여기 를 참조 하십시오 .


17

JohnMachin의 의견 은 실제 답변이되어야합니다. 다른 모든 대답은 내 의견으로는 해결 방법입니다! 그래서:

array=[0]*element_count

동의하다. 변수 "배열"을 호출하거나 순수한 분노를 얻는 것을 제외하고는. 이것에 덧붙여 "다차원 배열"을 유사하게 만들 수 있다고 x=[[0] * 10] * 10
덧붙입니다

17

몇 가지 기여는 파이썬의 배열이 목록으로 표현된다고 제안했습니다. 이것은 올바르지 않습니다. 파이썬은 array()표준 라이브러리 모듈에서 array " array.array()" 의 독립적 인 구현을 가지고 있으므로 혼동하는 것은 잘못입니다. 리스트는 파이썬으로 된리스트이므로 사용 된 명명법에주의하십시오.

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

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

list와 사이에는 매우 중요한 차이점이 array.array()있습니다. 이 두 객체 모두 순서가 배열 된 반면, array.array ()는 순서가 동일한 동종 시퀀스이지만 목록은 비 균일 시퀀스입니다.


16

파이썬에서는 아무것도 선언하지 않습니다. 당신은 그것을 사용합니다. http://diveintopython.net 과 같은 것으로 시작하는 것이 좋습니다 .


2
때로는 변수의 유형을 선언해야합니다. 전에 변수 구조를 사용하지 않으면 제어 구조 외부에 존재하지 않으므로 새 변수를 구성하게됩니다. 그러면 변수가 int라는 가정하에 변수를 더 복잡한 유형으로 사용하면 충돌합니다.
Cleared

@Clearer 그렇습니다. 함수를 사용하면 때로는 선언해야하며 때로는 함수를 사용할 때 일부 전역을 재생해야하며 함수에 너무 많은 인수를 쓰고 싶지 않습니다.
m3nda 2016 년

그것은 단지 기능이 아닙니다. 간단한 if 문으로도 같은 문제가 발생할 수 있습니다.
Clearer

1
프로그래밍은 어떤 언어를 사용하든 선언에 관한 것입니다. 선언 형식은 완전히 다른 이야기입니다
Outside_Box

이 링크가 질문에 대한 답변을 제공 할 수 있지만 여기에 답변의 필수 부분을 포함시키고 참조 용 링크를 제공하는 것이 좋습니다. 링크 된 페이지가 변경되면 링크 전용 답변이 유효하지 않을 수 있습니다.
Adrian Tompkins

13

나는 보통 a = [1,2,3]실제로 할 list것이지만 arrays이 공식적인 정의 를 살펴보십시오.


11

Lennart의 답변에 추가하기 위해 다음과 같이 배열을 만들 수 있습니다.

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

여기서 은 튜플, 목록 또는 np.array의 형식을 취할 수 있지만 배열은 할 수 없습니다.

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

출력은 여전히 ​​동일합니다.

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

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

list에 대한 대부분의 메소드는 배열에서도 작동하며 일반적인 메소드는 pop (), extend () 및 append ()입니다.

답변과 의견으로 판단하면 배열 데이터 구조가 그렇게 대중적이지 않은 것으로 보입니다. 그래도 목록보다 튜플을 선호하는 것과 같은 방식으로 좋아합니다.

배열 구조에는 목록 또는 np.array보다 엄격한 규칙이 있으므로 특히 숫자 데이터로 작업 할 때 오류를 줄이고 디버깅을 더 쉽게 할 수 있습니다.

float를 int 배열에 삽입 / 추가하려고하면 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

따라서 배열 형식으로 정수 (예 : 인덱스 목록)를 의미하는 값을 유지하면 "TypeError : list 인덱스가 부동 소수점이 아닌 정수 여야 함"을 방지 할 수 있습니다. np.array 및 list와 유사하게 배열을 반복 할 수 있기 때문입니다.

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

짜증나게, int를 float 배열에 추가하면 예외를 발생시키지 않고 int가 float가됩니다.

np.array는 항목에 대해 동일한 데이터 유형을 유지하지만 오류를 제공하는 대신 새 항목에 맞게 데이터 유형을 변경합니다 (일반적으로 double 또는 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

과제도 마찬가지입니다. 데이터 유형이 지정되면 np.array는 가능하면 항목을 해당 데이터 유형으로 변환합니다.

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_'>

또는 본질적으로 :

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

배열은 단순히 다음을 제공합니다.

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

이 때문에 유형별 명령에 np.array를 사용하는 것은 좋지 않습니다. 배열 구조는 여기서 유용합니다. list는 값의 데이터 유형을 유지합니다.

그리고 다소 성가신 것으로 생각됩니다 : 데이터 유형은 array ()의 첫 번째 인수로 지정되지만 (보통) np.array ()의 두 번째 인수로 지정됩니다. : |

C와의 관계는 여기에서 참조됩니다 : Python List vs. Array-언제 사용합니까?

탐험 재미있게 보내십시오!

참고 : 배열의 타이핑되고 엄격한 성격은 파이썬보다는 C에 더 의존하며, 파이썬은 기능상 많은 유형별 제약을 갖지 않습니다. 그것의 인기는 또한 공동 작업에서 긍정적 인 피드백을 만들어 내고 그것을 대체하는 것은 대체로 추가적인 파일 [int (x) for x]를 포함한다. 따라서 배열의 존재를 무시하는 것은 전적으로 실행 가능하고 합리적입니다. 어떤 식 으로든 우리 대부분을 방해해서는 안됩니다. :디


8

이건 어때요...

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

6

파이썬은 그것들을 리스트 라고 부릅니다 . 대괄호와 쉼표로 목록 리터럴을 작성할 수 있습니다.

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

5

Lennart에 이어 균질 한 다차원 배열을 구현하는 numpy 도 있습니다.


4

나는 문자열 배열을 가지고 있었고 True로 시작된 동일한 길이의 부울 배열이 필요했습니다. 이것이 내가 한 일입니다

strs = ["Hi","Bye"] 
bools = [ True for s in strs ]

나는 C 선언을 원했기 때문에 여기에 int count[26]={0}; 있습니다. 아마도 더 좋은 방법이 있지만 bools위의 변형이 count=[0 for ii in range(26)]나중에 작동 하여 count=[0]*26선호하는 것으로 변경했습니다 .
user1683793

2

리스트를 생성하여 배열로 변환하거나 numpy 모듈을 사용하여 배열을 생성 할 수 있습니다. 아래는 동일한 설명을위한 몇 가지 예입니다. Numpy는 또한 다차원 배열로 작업하기가 더 쉽습니다.

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

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

행렬의 크기로 입력을받는 형태 변경 기능을 사용하여이 배열을 2X2 행렬로 재구성 할 수도 있습니다.

mat = a.reshape(2, 2)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.