ฉันจะหาอาร์เรย์ว่างขนาดใดก็ได้ใน python ได้อย่างไร


120

โดยทั่วไปฉันต้องการ python เทียบเท่ากับสิ่งนี้ใน C:

int a[x];

แต่ใน python ฉันประกาศอาร์เรย์เช่น:

a = []

และปัญหาคือฉันต้องการกำหนดช่องสุ่มด้วยค่าเช่น:

a[4] = 1

แต่ฉันไม่สามารถทำได้ด้วย python เนื่องจากอาร์เรย์ว่างเปล่า

คำตอบ:


240

ถ้าโดย "array" คุณหมายถึงรายการ Python จริง ๆ คุณสามารถใช้

a = [0] * 10

หรือ

a = [None] * 10

91
สิ่งหนึ่งที่คุณต้องระวังa = [obj] * Nคือ obj เดียวกันจะปรากฏในแต่ละองค์ประกอบของอาร์เรย์ หากเป็น obj ที่ไม่แน่นอนและคุณแก้ไขรายการหนึ่งรายการทั้งหมดจะเปลี่ยนไป ... แต่สำหรับตัวอย่างนี้โดยใช้จำนวนเต็ม (หรือชนิดอื่น ๆ ที่ไม่เปลี่ยนรูป) จะไม่แตกต่างกัน หรือถ้าคุณแค่กำหนดให้กับองค์ประกอบก็ไม่ใช่ปัญหาเช่นกัน (ฉันพูดถึงมันเพราะฉันทำบ่อยเกินไปแล้ว :))
dappawit

4
นั่นทำให้ฉันลำบากในโครงการ Python แรกของฉัน @dappawit ฟังคำเตือนนี้
The Nate

มันสร้างการอ้างอิงเดียวกันสำหรับวัตถุ
Amr Alaa

22

คุณไม่สามารถทำสิ่งที่คุณต้องการใน Python ได้ (ถ้าฉันอ่านคุณถูกต้อง) คุณต้องใส่ค่าสำหรับแต่ละองค์ประกอบของรายการ (หรือที่คุณเรียกว่าอาร์เรย์)

แต่ลองสิ่งนี้:

a = [0 for x in range(N)]  # N = size of list you want
a[i] = 5  # as long as i < N, you're okay

สำหรับรายการประเภทอื่น ๆ ให้ใช้สิ่งที่นอกเหนือจาก 0 Noneมักจะเป็นตัวเลือกที่ดีเช่นกัน


2
คำตอบนี้อยู่ในกรอบที่ไม่ถูกต้อง range(N)จะสร้างรายการขึ้นมาแล้วถ้า Python <3.0
Apalala

1
ทรูจะจัดทำรายการ หากคุณกังวลเรื่องประสิทธิภาพคุณสามารถใช้xrange(N)ใน Python 2.x. ฉันไม่แน่ใจว่ามันมีพรมแดนติดกับสิ่งที่ไม่ถูกต้องอย่างไร ฉันชอบa = range(N)เพราะทุกองค์ประกอบเริ่มต้นด้วย "ค่าเริ่มต้น" ที่สมเหตุสมผล ฉันเดาว่ามันเป็นเรื่องของความคิดเห็น
dappawit


7

เพียงแค่ประกาศรายชื่อและต่อท้ายแต่ละองค์ประกอบ สำหรับเช่น:

a = []
a.append('first item')
a.append('second item')

5
แล้วคุณจะ 'กำหนดช่องสุ่ม' อย่างไร
Tdelang

5

นอกจากนี้คุณยังสามารถขยายได้ด้วยวิธีการขยายรายการ

a= []
a.extend([None]*10)
a.extend([None]*20)

1

หากคุณ (หรือผู้ค้นหาอื่น ๆ ของคำถามนี้) สนใจที่จะสร้างอาร์เรย์ที่ต่อเนื่องกันเพื่อเติมเต็มด้วยจำนวนเต็มให้พิจารณาbytearrayและmemoryivew :

# cast() is available starting Python 3.3
size = 10**6 
ints = memoryview(bytearray(size)).cast('i') 

ints.contiguous, ints.itemsize, ints.shape
# (True, 4, (250000,))

ints[0]
# 0

ints[0] = 16
ints[0]
# 16

1
x=[]
for i in range(0,5):
    x.append(i)
    print(x[i])

2
แม้ว่ารหัสนี้จะช่วยแก้ปัญหาได้รวมถึงคำอธิบายว่าทำไมจึงแก้ปัญหานี้ได้จะช่วยปรับปรุงคุณภาพของโพสต์ของคุณได้อย่างแท้จริงและอาจส่งผลให้มีการโหวตเพิ่มขึ้น จำไว้ว่าคุณกำลังตอบคำถามสำหรับผู้อ่านในอนาคตไม่ใช่แค่คนที่ถามตอนนี้ โปรดแก้ไขคำตอบของคุณเพื่อเพิ่มคำอธิบายและระบุข้อ จำกัด และสมมติฐานที่ใช้
Daniil

0

หากคุณต้องการอาร์เรย์สไตล์ C จริงๆ

import array
a = array.array('i', x * [0])
a[3] = 5
try:
   [5] = 'a'
except TypeError:
   print('integers only allowed')

โปรดทราบว่าไม่มีแนวคิดของตัวแปรที่ไม่ได้เริ่มต้นใน python ตัวแปรคือชื่อที่ผูกไว้กับค่าดังนั้นค่านั้นจะต้องมีบางอย่าง ในตัวอย่างด้านบนอาร์เรย์เริ่มต้นด้วยศูนย์

อย่างไรก็ตามนี่เป็นเรื่องผิดปกติใน python เว้นแต่คุณจะต้องการมันสำหรับของระดับต่ำ ในกรณีส่วนใหญ่คุณควรเลือกใช้รายการว่างหรืออาร์เรย์ numpy ว่างเปล่าตามที่คำตอบอื่น ๆ แนะนำ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.