ฉันจะประกาศอาร์เรย์ในPython ได้อย่างไร
ฉันไม่พบการอ้างอิงถึงอาร์เรย์ในเอกสารประกอบ
__getitem__
จะไม่เป็น O (1)
ฉันจะประกาศอาร์เรย์ในPython ได้อย่างไร
ฉันไม่พบการอ้างอิงถึงอาร์เรย์ในเอกสารประกอบ
__getitem__
จะไม่เป็น O (1)
คำตอบ:
variable = []
ตอนนี้variable
หมายถึงรายการที่ว่างเปล่า*
แน่นอนว่านี่คือการมอบหมายไม่ใช่การประกาศ ไม่มีทางที่จะพูดใน Python "ตัวแปรนี้ไม่ควรอ้างถึงสิ่งอื่นนอกจากรายการ" เนื่องจาก Python ถูกพิมพ์แบบไดนามิก
*ชนิด Python ในตัวเริ่มต้นเรียกว่ารายการไม่ใช่อาร์เรย์ มันเป็นตู้คอนเทนเนอร์ที่มีความยาวตามอำเภอใจซึ่งสามารถเก็บวัตถุต่างชนิดกันได้ (ประเภทของวัตถุนั้นไม่สำคัญและสามารถผสมได้อย่างอิสระ) สิ่งนี้ไม่ควรสับสนกับarray
โมดูลซึ่งให้ประเภทที่ใกล้เคียงกับarray
ประเภทC มากขึ้น เนื้อหาจะต้องเป็นเนื้อเดียวกัน (ทุกประเภทเดียวกัน) แต่ความยาวยังคงเป็นแบบไดนามิก
variable = ["Hi", "Hello"];
?)
my_2x2_list = [[a, b], [c, d]]
ได้ ขึ้นอยู่กับสิ่งที่คุณต้องการอาร์เรย์หลายมิติสำหรับคุณยังอาจพิจารณาใช้numpy
ซึ่งกำหนดประเภทอาร์เรย์สำหรับอาร์เรย์หลายมิติที่เป็นเนื้อเดียวกันและไม่มีกล่องที่สามารถมีประสิทธิภาพมากขึ้นถ้าสามารถทำได้ดังนั้นจึงเหมาะสำหรับการคำนวณเชิงตัวเลข
นี่เป็นหัวข้อที่ซับซ้อนอย่างน่าประหลาดใจใน Python
อาร์เรย์เป็นตัวแทนของคลาสlist
(ดูการอ้างอิงและไม่ผสมกับเครื่องกำเนิดไฟฟ้า )
ดูตัวอย่างการใช้งาน:
# 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)
ภายใต้ประทุน Python list
เป็นเสื้อคลุมสำหรับอาเรย์จริงที่มีการอ้างอิงถึงรายการ นอกจากนี้อาร์เรย์พื้นฐานจะถูกสร้างขึ้นด้วยพื้นที่พิเศษบางส่วน
ผลที่ตามมาของสิ่งนี้คือ:
arr[6653]
เหมือนกับarr[0]
)append
การดำเนินงานคือ 'ฟรี' ในขณะที่บางพื้นที่พิเศษinsert
การดำเนินการมีราคาแพงตรวจสอบตารางการปฏิบัติการที่ยอดเยี่ยมนี้
นอกจากนี้โปรดดูรูปภาพนี้ซึ่งฉันได้พยายามแสดงความแตกต่างที่สำคัญที่สุดระหว่างอาร์เรย์ลำดับการอ้างอิงและรายการที่ลิงก์:
[1, 2, 3, 4, 5, 6, 7, 8, 9][1:-2]
ผลจะเป็น[2, 3, 4, 5, 6, 7]
a == b[:2]
return จริงถ้า 2 องค์ประกอบแรกของbเท่ากับค่าของอาร์เรย์a
คุณไม่ได้ประกาศสิ่งต่าง ๆ แต่นี่เป็นวิธีที่คุณสร้างอาร์เรย์ใน Python:
from array import array
intarray = array('i')
สำหรับข้อมูลเพิ่มเติมดูโมดูลอาร์เรย์: http://docs.python.org/library/array.html
ตอนนี้เป็นไปได้ที่คุณไม่ต้องการอาร์เรย์ แต่เป็นรายการ แต่คนอื่น ๆ ได้ตอบแล้ว :)
list
ในงูใหญ่คุณมักจะใช้ชนิดข้อมูลที่เรียกว่า Python มีประเภทข้อมูลวัตถุประสงค์พิเศษที่เรียกว่าarray
ซึ่งเป็นเหมือนอาร์เรย์ C และมีการใช้เพียงเล็กน้อย
ฉันคิดว่าคุณ (หมายถึง) ต้องการรายชื่อที่เต็มไปด้วย 30 เซลล์แรกแล้ว ดังนั้น
f = []
for i in range(30):
f.append(0)
ตัวอย่างที่สามารถใช้สิ่งนี้ได้อยู่ในลำดับฟีโบนักชี ดูปัญหาที่ 2 ในProject Euler
f = [0] * 30
แทน
นี่คือวิธี:
my_array = [1, 'rebecca', 'allard', 15]
สำหรับการคำนวณใช้อาร์เรย์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
ใช้มากในสภาพแวดล้อมทางวิทยาศาสตร์ ดูที่นี่สำหรับข้อมูลเพิ่มเติม
ความคิดเห็นของ JohnMachinควรเป็นคำตอบที่แท้จริง คำตอบอื่น ๆ ทั้งหมดเป็นเพียงการแก้ปัญหาในความคิดของฉัน! ดังนั้น:
array=[0]*element_count
x=[[0] * 10] * 10
การมีส่วนร่วมสองข้อเสนอแนะว่าอาร์เรย์ในไพ ธ อนนั้นมีรายการอยู่ สิ่งนี้ไม่ถูกต้อง Python มีการนำไปใช้อย่างอิสระarray()
ในโมดูลไลบรารีมาตรฐานarray
" array.array()
" ดังนั้นจึงไม่ถูกต้องที่จะทำให้ทั้งสองสับสน รายการคือรายการในไพ ธ อนดังนั้นควรระมัดระวังการใช้ระบบการตั้งชื่อ
list_01 = [4, 6.2, 7-2j, 'flo', 'cro']
list_01
Out[85]: [4, 6.2, (7-2j), 'flo', 'cro']
array.array()
มีสิ่งหนึ่งที่แตกต่างที่สำคัญมากระหว่างรายการและเป็น ในขณะที่วัตถุทั้งสองนี้ได้รับการเรียงลำดับแล้ว array.array () เป็นลำดับที่เป็นเนื้อเดียวกันในขณะที่รายการเป็นลำดับที่ไม่เป็นเนื้อเดียวกัน
คุณไม่ได้ประกาศอะไรเลยใน Python คุณแค่ใช้มัน ผมขอแนะนำให้คุณเริ่มต้นกับสิ่งที่ต้องการhttp://diveintopython.net
ปกติฉันจะทำa = [1,2,3]
ซึ่งจริงๆแล้วเป็นlist
แต่เพื่อarrays
ดูคำจำกัดความที่เป็นทางการนี้
ในการเพิ่มคำตอบของ Lennart อาเรย์อาจถูกสร้างเช่นนี้
from array import array
float_array = array("f",values)
โดยที่ค่าสามารถอยู่ในรูปแบบของ tuple, list หรือ np.array แต่ไม่ใช่ 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
เมธอดส่วนใหญ่สำหรับลิสต์จะทำงานร่วมกับอาเรย์เช่นกันโดยทั่วไปจะเป็นป๊อป (), ขยาย () และผนวก ()
เมื่อพิจารณาจากคำตอบและความคิดเห็นปรากฏว่าโครงสร้างข้อมูลอาร์เรย์ไม่เป็นที่นิยม ฉันชอบมันเช่นเดียวกับที่คน ๆ หนึ่งอาจชอบสิ่งอันดับมากกว่ารายการ
โครงสร้างอาร์เรย์มีกฎที่เข้มงวดกว่ารายการหรือ np.array และสิ่งนี้สามารถลดข้อผิดพลาดและทำให้การดีบักง่ายขึ้นโดยเฉพาะเมื่อทำงานกับข้อมูลตัวเลข
ความพยายามที่จะแทรก / ต่อท้ายลอยไปยังอาร์เรย์ 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: ดัชนีรายการจะต้องเป็นจำนวนเต็มไม่ใช่ลอย" เนื่องจากอาร์เรย์สามารถทำซ้ำได้คล้ายกับ np.array และรายการ:
int_array = array('i',[1,2,3])
data = [11,22,33,44,55]
sample = []
for i in int_array:
sample.append(data[i])
น่ารำคาญการผนวก int เข้ากับอาร์เรย์แบบลอยจะทำให้ int เปลี่ยนเป็นแบบลอยโดยไม่ส่งข้อยกเว้น
np.array รักษาชนิดข้อมูลเดียวกันสำหรับรายการด้วยเช่นกัน แต่แทนที่จะให้ข้อผิดพลาดมันจะเปลี่ยนประเภทข้อมูลให้พอดีกับรายการใหม่ (โดยปกติจะเป็นสองเท่าหรือ 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 สำหรับคำสั่งเฉพาะประเภท โครงสร้างอาร์เรย์มีประโยชน์ที่นี่ รายการเก็บรักษาชนิดข้อมูลของค่า
และสำหรับบางสิ่งที่ฉันพบค่อนข้างน่ารำคาญ: ชนิดข้อมูลถูกระบุว่าเป็นอาร์กิวเมนต์แรกในอาร์เรย์ () แต่ (ปกติ) อันดับที่สองใน np.array () : |
ความสัมพันธ์กับ C ถูกอ้างถึงที่นี่: Python List vs. Array - เมื่อใดควรใช้?
ขอให้สนุกกับการสำรวจ!
หมายเหตุ: ลักษณะที่พิมพ์และค่อนข้างเข้มงวดของอาร์เรย์โน้มไปทาง C มากกว่า Python และโดยการออกแบบ Python ไม่มีข้อ จำกัด เฉพาะหลายประเภทในการทำงาน ความไม่เป็นที่นิยมของมันยังสร้างผลตอบรับเชิงบวกในการทำงานร่วมกันและการแทนที่มันส่วนใหญ่เกี่ยวข้องกับ [int (x) สำหรับ x ในไฟล์] ดังนั้นจึงเป็นไปได้ทั้งหมดและมีเหตุผลที่จะไม่สนใจการดำรงอยู่ของอาร์เรย์ ไม่ควรขัดขวางพวกเราส่วนใหญ่ในทางใดทางหนึ่ง : D
แล้ว ...
>>> a = range(12)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
>>> a[7]
6
ต่อจากเลนนาร์ทนอกจากนี้ยังมีnumpyซึ่งการดำเนินการอาร์เรย์หลายมิติที่เป็นเนื้อเดียวกัน
ฉันมีชุดของสตริงและต้องการอาร์เรย์ที่มีความยาวเท่ากันของบูลีนที่เริ่มต้นเป็น True นี่คือสิ่งที่ฉันทำ
strs = ["Hi","Bye"]
bools = [ True for s in strs ]
int count[26]={0};
อาจเป็นวิธีที่ดีกว่า แต่ตัวแปรbools
จากด้านบนนี้ใช้งานได้ใน count=[0 for ii in range(26)]
ภายหลังจากนั้นฉันเปลี่ยนเป็นรูปแบบcount=[0]*26
ที่ดีกว่า
คุณสามารถสร้างรายการและแปลงเป็นอาร์เรย์หรือคุณสามารถสร้างอาร์เรย์โดยใช้โมดูล 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)