วิธีกำหนดอาเรย์สองมิติใน Python


723

ฉันต้องการกำหนดอาเรย์สองมิติโดยไม่มีความยาวเริ่มต้นเช่นนี้

Matrix = [][]

แต่มันไม่ทำงาน ...

ฉันได้ลองใช้รหัสด้านล่างแล้ว แต่มันก็ผิดเช่นกัน:

Matrix = [5][5]

ข้อผิดพลาด:

Traceback ...

IndexError: list index out of range

ความผิดพลาดของฉันคืออะไร?


14
หนึ่งไม่ได้กำหนดอาร์เรย์หรือสิ่งอื่นใด อย่างไรก็ตามคุณสามารถสร้างลำดับหลายมิติได้ตามคำตอบที่แสดง โปรดจำไว้ว่าตัวแปรไพ ธ อนนั้นไม่ได้พิมพ์ออกมาแต่ค่าจะถูกพิมพ์อย่างมาก
SingleNegationElimination

1
ฉันสับสน มาจากภาษาอื่น: มันเป็นข้อแตกต่างระหว่าง 1D-Array ที่บรรจุ 1D-Arays และ 2D-Array และ AFAIK ไม่มีทางที่จะมีหลายมิติอาเรย์ (หรือรายการ) ในหลาม ควรจะพูดที่นี่ ...
Dirk Reichel

1
ดู Python3 คำถามที่พบบ่อยเกี่ยวกับฉันจะสร้างรายการหลายมิติได้อย่างไร
Kevin W Matthews

คำตอบ:


1008

คุณกำลังพยายามสร้างดัชนีอาร์เรย์ที่ไม่มีการกำหนดค่าทางเทคนิค คุณต้องเริ่มต้นรายการภายนอกด้วยรายการก่อนเพิ่มรายการ Python เรียกสิ่งนี้ว่า "list comprehension"

# Creates a list containing 5 lists, each of 8 items, all set to 0
w, h = 8, 5;
Matrix = [[0 for x in range(w)] for y in range(h)] 

ตอนนี้คุณสามารถเพิ่มรายการลงในรายการ:

Matrix[0][0] = 1
Matrix[6][0] = 3 # error! range... 
Matrix[0][6] = 3 # valid

โปรดทราบว่าเมทริกซ์คือ "y" address major กล่าวอีกนัยหนึ่งว่า "y index" มาก่อน "x index"

print Matrix[0][0] # prints 1
x, y = 0, 6 
print Matrix[x][y] # prints 3; be careful with indexing! 

แม้ว่าคุณจะสามารถตั้งชื่อตามที่ต้องการได้ แต่ฉันก็มองด้วยวิธีนี้เพื่อหลีกเลี่ยงความสับสนที่อาจเกิดขึ้นกับการทำดัชนีหากคุณใช้ "x" สำหรับทั้งรายการภายในและภายนอกและต้องการเมทริกซ์ที่ไม่ใช่สแควร์


219
[[0 สำหรับ x ในช่วง (cols_count)] สำหรับ x ในช่วง (row_count)]
songhir

3
แก้ไขคี่โดย ademar111190 ใน Python 3 ไม่มี xrange แต่ถ้าคุณต้องใช้ Python 2 แล้ว xrange นั้นเป็นฟังก์ชั่นที่ถูกต้องที่จะใช้ถ้าคุณไม่ต้องการสร้างวัตถุโดยไม่จำเป็น
เดฟ

4
@dave หากคุณไม่ต้องการให้เต็มศูนย์คุณสามารถใช้rangeเพื่อสร้างรายการภายในได้โดยตรง:[range(5) for x in range(5)]
alanjds

2
@alanjds - นั่นเป็นความจริง แต่คุณยังคงสร้างการอ้างอิงวัตถุที่ไม่จำเป็นจำนวนมากใน Python 2 สำหรับการทำซ้ำรอบนอก (ลองใช้กับช่วงที่มีขนาดใหญ่มาก) นอกจากนี้การกำหนดค่าเริ่มต้นให้กับค่าบางค่านั้นเกือบจะเป็นสิ่งที่คุณต้องการเสมอและนี่ก็เป็นช่วงที่มากกว่า 0 ไม่ได้ทำให้เกิดคอลเลคชั่น iterable - xrange จะส่งกลับเครื่องกำเนิดไฟฟ้า ประเด็นของฉันคือ ademar "แก้ไข" สิ่งที่โดยทั่วไปถูกต้องและมีประสิทธิภาพมากกว่าการแก้ไขของเขา
เดฟ

10
@ 6pack เด็ก ๆ มี[0] * wส่วนดี แต่[[0] * w] * h]จะสร้างพฤติกรรมที่ไม่คาดคิด ลองและmat = [[0] * 3] * 3; mat[0][1] = 10; print(mat == [[0, 10, 0], [0, 10, 0], [0, 10, 0]]) mat = [[0] * 3 for i in range(3)]; mat[0][1] = 10; print(mat == [[0, 10, 0], [0, 0, 0], [0, 0, 0]])
senderle

407

numpyหากคุณต้องการเมทริกซ์จริงๆคุณอาจจะดีกว่าการใช้ การดำเนินการของเมทริกซ์ในnumpyส่วนใหญ่มักจะใช้ประเภทอาร์เรย์ที่มีสองมิติ มีหลายวิธีในการสร้างอาร์เรย์ใหม่ หนึ่งในสิ่งที่มีประโยชน์มากที่สุดคือzerosฟังก์ชั่นซึ่งใช้พารามิเตอร์รูปร่างและส่งกลับอาร์เรย์ของรูปร่างที่กำหนดโดยมีค่าเริ่มต้นเป็นศูนย์:

>>> import numpy
>>> numpy.zeros((5, 5))
array([[ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.]])

ต่อไปนี้เป็นวิธีอื่น ๆ ในการสร้างอาร์เรย์ 2 มิติและเมทริกซ์ (โดยเอาเอาต์พุตออกเพื่อความกะทัดรัด):

numpy.arange(25).reshape((5, 5))         # create a 1-d range and reshape
numpy.array(range(25)).reshape((5, 5))   # pass a Python range and reshape
numpy.array([5] * 25).reshape((5, 5))    # pass a Python list and reshape
numpy.empty((5, 5))                      # allocate, but don't initialize
numpy.ones((5, 5))                       # initialize with ones

numpyยังมีmatrixประเภทเช่นกัน แต่ก็ไม่แนะนำสำหรับการใด ๆการใช้งานและอาจถูกลบออกจากnumpyในอนาคต


79
เมื่อใดก็ตามที่คุณต้องการเมทริกซ์คุณต้องการใช้จำนวนมาก คำตอบนี้ควรเป็นอันดับแรก
Pat B

2
ความจริงที่ว่าคำถามใช้คำว่า "เมทริกซ์" ในภาษาอังกฤษไม่ได้หมายความว่าควรใช้np.matrixเพื่อเป็นตัวแทนของมัน วิธีการที่เหมาะสมที่จะเป็นตัวแทนเมทริกซ์ใน numpy arrayเป็นกับ
user2357112 รองรับ Monica

@ user2357112 และอย่างที่คุณเห็นตัวอย่างส่วนใหญ่ที่แสดงไว้ด้านบนเอาต์พุตarrays แทนเมทริกซ์ แม้ว่าจะไม่ได้รับการสนับสนุนเสมอไป แต่ก็มีเหตุผลที่ถูกต้องสำหรับการใช้matrix- เรื่องบริบท
senderle

1
@senderle คุณสามารถขยายเหตุผลในการใช้งานได้matrixหรือไม่ เนื่องจากมี@การแนะนำโอเปอเรเตอร์ดูเหมือนว่าจะมีเหตุผลน้อยกว่าเนื่องจากโพสต์นี้ถูกเขียนขึ้น
jpp

1
@jpp ตามที่กล่าวไว้ก่อนหน้านี้คนที่มาจาก matlab อาจพบว่ามีประโยชน์ แต่numpyตอนนี้เอกสารระบุว่าชั้นอาจถูกเลิกใช้และลบออกในอนาคตดังนั้นฉันจึงเอามันออกไปจากคำตอบ
senderle

337

นี่คือสัญกรณ์สั้นลงสำหรับการเริ่มต้นรายการรายการ:

matrix = [[0]*5 for i in range(5)]

น่าเสียดายที่การตัดทอนสิ่งนี้ลงในสิ่งที่ชอบ5*[5*[0]]ไม่ได้ผลจริง ๆ เพราะคุณจบลงด้วยรายการที่เหมือนกัน 5 ชุดดังนั้นเมื่อคุณแก้ไขหนึ่งในนั้นพวกเขาจะเปลี่ยนตัวอย่างเช่น

>>> matrix = 5*[5*[0]]
>>> matrix
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
>>> matrix[4][4] = 2
>>> matrix
[[0, 0, 0, 0, 2], [0, 0, 0, 0, 2], [0, 0, 0, 0, 2], [0, 0, 0, 0, 2], [0, 0, 0, 0, 2]]

4
คุณสามารถอธิบายเหตุผลที่อยู่เบื้องหลังความล้มเหลว "การย่อ" ได้หรือไม่? ทำไมสำเนาเอาท์พุทหลามของรายการเดียวกันในกรณีนี้และอาเรย์ของเซลล์ที่แตกต่างกันในกรณีของการที่[0]*5?
mike622867

12
ความคิดเห็นด้านบนนั้นไม่เป็นความจริง: [0] * 5 ยังคงสร้างลำดับที่มีการอ้างอิง 5 เท่ากับวัตถุเดียวกันที่แสดงหมายเลข 0 แต่คุณจะไม่สังเกตเห็นสิ่งนี้เพราะ 0 เป็นค่าไม่เปลี่ยนรูป (ฉันจะบอกว่า 0 พฤติกรรมเช่นค่า - หรือคุณอาจคิดว่ามันเป็นชนิดข้อมูลดั้งเดิม - เพราะมันไม่เปลี่ยนรูปแบบดังนั้นคุณไม่เคยได้รับปัญหาเกี่ยวกับการอ้างอิงไปยังวัตถุเดียวกันแทนที่จะมีสำเนา)
dreua

4
pythonic เพิ่มเติม: [[0]*5 for _ in range(5)]ด้วยตัวนับลูปแบบไม่ระบุชื่อคุณไม่ได้ใช้
Jean-François Fabre

ยินดีที่คุณชี้ให้เห็นปัญหาของการคัดลอกตื้นในตัวอย่างที่สอง
whatacold

ขอบคุณ @dreua ฉันสับสนจริง ๆ ว่า[0]*5ทำงานได้ดี ตอนนี้ฉันเข้าใจแล้วว่าทำไม[{0}]*8จะเป็นความคิดที่ไม่ดีด้วย
kuku

110

ถ้าคุณต้องการสร้างเมทริกซ์ที่ว่างเปล่าไวยากรณ์ที่ถูกต้องคือ

matrix = [[]]

และถ้าคุณต้องการสร้างเมทริกซ์ขนาด 5 ที่เต็มไปด้วย 0

matrix = [[0 for i in xrange(5)] for i in xrange(5)]

@KorayTugay เนื่องจากเมทริกซ์แสดงโดยใช้รายการ Python (แถว) ซ้อนอยู่ภายในรายการอื่น (คอลัมน์)
Elig

2
สำหรับ Python-3 ให้ใช้ฟังก์ชั่นพิสัยแทน xrange func
Rakesh Chaudhari

76

หากสิ่งที่คุณต้องการคือคอนเทนเนอร์สองมิติเพื่อเก็บองค์ประกอบบางอย่างคุณสามารถใช้พจนานุกรมได้อย่างสะดวกแทน:

Matrix = {}

จากนั้นคุณสามารถทำได้:

Matrix[1,2] = 15
print Matrix[1,2]

สิ่งนี้ได้ผลเพราะ1,2เป็นสิ่งอันดับและคุณใช้มันเป็นกุญแจในการจัดทำดัชนีพจนานุกรม ผลลัพธ์จะคล้ายกับเมทริกซ์หร็อมแหร็มโง่

ตามที่ระบุโดย OSA และ Josap Valls คุณยังสามารถใช้เพื่อให้องค์ประกอบที่ขาดหายไปมีค่าเริ่มต้นของMatrix = collections.defaultdict(lambda:0)0

Vatsal ชี้ให้เห็นเพิ่มเติมว่าวิธีนี้อาจไม่ได้มีประสิทธิภาพมากนักสำหรับเมทริกซ์ขนาดใหญ่และควรใช้เฉพาะในส่วนที่ไม่สำคัญต่อประสิทธิภาพของโค้ด


2
จากนั้นคุณสามารถทำได้import collections; Matrix = collections.defaultdict(float)เพื่อแทนที่ค่าศูนย์สำหรับองค์ประกอบที่ไม่มีค่าเริ่มต้น
osa

2
จะไม่เข้าถึง dict สำหรับ tuple (1,2) เนื่องจากคีย์มีความซับซ้อนของกรณีที่แย่ที่สุดของ O (n) ภายในจะทำให้แฮ็ก tuples เป็นภายใน ขณะที่การใช้อาร์เรย์ 2 มิติจะทำให้ความซับซ้อนของเวลา O (1) ในการเข้าถึงดัชนี [1,2] ดังนั้นการใช้ dict ในครั้งนี้จึงไม่ใช่ทางเลือกที่ดี
Vatsal

@Vatsal wiki.python.org/moin/TimeComplexityบอกว่ากรณีโดยเฉลี่ยคือ O (1) แต่คุณพูดถูกเกี่ยวกับกรณีที่เลวร้ายที่สุด อย่างไรก็ตามถ้าคุณกำลังพูดถึงรายการจำนวนมากคุณจะไม่สนใจความแตกต่างนี้ ตามความเป็นจริงฉันจะกังวลเกี่ยวกับหน่วยความจำมากกว่าเวลาเข้าถึง
enobayram

นอกจากนี้เราพยายามหลีกเลี่ยงการใช้ dicts อยู่เสมอจนกว่าความซับซ้อนโดยรวมของอัลกอริทึมจะเท่ากับหรือมากกว่า O (n ^ 2) ในฐานะที่เป็น 'n' คูณ O (n) การเข้าถึงจะให้ความซับซ้อน O (n ^ 2)
Vatsal

@enobayram ขออภัย แต่ฉันไม่เห็นด้วย การวิเคราะห์เชิงสัญลักษณ์จะให้ O (n ^ 2) เสมอหากการเข้าถึง O (n) กรณีที่เลวร้ายที่สุดถูกทำ 'n' ครั้ง ในกรณีที่การวิเคราะห์ค่าตัดจำหน่ายสามารถทำให้ขอบเขตน้อยลง และมีความแตกต่างอย่างมากระหว่างค่าตัดจำหน่ายและค่าเฉลี่ยคือ ... โปรดอ้างอิงก่อนที่จะทำการตั้งสมมติฐานและความคิดเห็นที่คลุมเครือ
Vatsal

42

ใน Python คุณจะสร้างรายการของรายการ คุณไม่จำเป็นต้องประกาศขนาดล่วงหน้า แต่คุณสามารถทำได้ ตัวอย่างเช่น:

matrix = []
matrix.append([])
matrix.append([])
matrix[0].append(2)
matrix[1].append(3)

ทีนี้เมทริกซ์ [0] [0] == 2 และเมทริกซ์ [1] [0] == 3 คุณยังสามารถใช้ไวยากรณ์รายการความเข้าใจ ตัวอย่างนี้ใช้สองครั้งเพื่อสร้าง "รายการสองมิติ":

from itertools import count, takewhile
matrix = [[i for i in takewhile(lambda j: j < (k+1) * 10, count(k*10))] for k in range(10)]

6
extendนอกจากนี้ยังจะเป็นประโยชน์ในกรณีแรก: ถ้าคุณเริ่มต้นด้วยm = [[]]แล้วคุณสามารถเพิ่มรายชื่อภายใน (ขยายแถว) ด้วยm[0].extend([1,2])และเพิ่มรายการนอก (ผนวกแถวใหม่) ที่มีการดำเนินงานเหล่านั้นจะทำให้คุณมีm.append([3,4]) [[1, 2], [3, 4]]
askewchan

22

คำตอบที่ยอมรับนั้นดีและถูกต้อง แต่ใช้เวลาพอสมควรที่จะเข้าใจว่าฉันสามารถใช้มันเพื่อสร้างอาร์เรย์ที่ว่างเปล่าได้อย่างสมบูรณ์

l =  [[] for _ in range(3)]

ผลลัพธ์ใน

[[], [], []]

22

คุณควรทำรายการและวิธีที่ดีที่สุดคือใช้ความเข้าใจแบบซ้อน:

>>> matrix = [[0 for i in range(5)] for j in range(5)]
>>> pprint.pprint(matrix)
[[0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0]]

ใน[5][5]ตัวอย่างของคุณคุณกำลังสร้างรายการที่มีจำนวนเต็ม "5" ข้างในและพยายามเข้าถึงรายการที่ 5 ของมันและสิ่งนั้นจะเป็นการเพิ่ม IndexError โดยธรรมชาติเพราะไม่มีรายการที่ 5:

>>> l = [5]
>>> l[5]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

จริง ๆ แล้วลำดับสำหรับ row_index ('i') และ column_index ('j') มีดังนี้: '>>> matrix = [[0 สำหรับ column_index ในช่วง (5)] สำหรับ row_index ในช่วง (5)]'
Aniruddha Kalburgi

22
rows = int(input())
cols = int(input())

matrix = []
for i in range(rows):
  row = []
  for j in range(cols):
    row.append(0)
  matrix.append(row)

print(matrix)

ทำไมรหัสยาว ๆ แบบนั้นที่Pythonคุณถามด้วย?

นานมาแล้วเมื่อฉันไม่พอใจกับ Python ฉันเห็นคำตอบบรรทัดเดียวสำหรับการเขียนเมทริกซ์ 2D และบอกกับตัวเองว่าฉันจะไม่ใช้เมทริกซ์ 2 มิติใน Python อีกครั้ง (บรรทัดเดียวนั้นค่อนข้างน่ากลัวและมันก็ไม่ได้ให้ข้อมูลกับฉันเกี่ยวกับสิ่งที่ Python กำลังทำอยู่นอกจากนี้โปรดทราบว่าฉันไม่ทราบถึงการจดชวเลขเหล่านี้)

อย่างไรก็ตามนี่คือรหัสสำหรับผู้เริ่มต้นที่มาจากพื้นหลัง C, CPP และ Java

หมายเหตุถึงคนรักและผู้เชี่ยวชาญของ Python: โปรดอย่าลงคะแนนเสียงเพียงเพราะฉันเขียนรหัสโดยละเอียด


13

เขียนใหม่เพื่อให้อ่านง่าย:

# 2D array/ matrix

# 5 rows, 5 cols
rows_count = 5
cols_count = 5

# create
#     creation looks reverse
#     create an array of "cols_count" cols, for each of the "rows_count" rows
#        all elements are initialized to 0
two_d_array = [[0 for j in range(cols_count)] for i in range(rows_count)]

# index is from 0 to 4
#     for both rows & cols
#     since 5 rows, 5 cols

# use
two_d_array[0][0] = 1
print two_d_array[0][0]  # prints 1   # 1st row, 1st col (top-left element of matrix)

two_d_array[1][0] = 2
print two_d_array[1][0]  # prints 2   # 2nd row, 1st col

two_d_array[1][4] = 3
print two_d_array[1][4]  # prints 3   # 2nd row, last col

two_d_array[4][4] = 4
print two_d_array[4][4]  # prints 4   # last row, last col (right, bottom element of matrix)

13

ใช้:

matrix = [[0]*5 for i in range(5)]

* 5 สำหรับมิติแรกใช้งานได้เนื่องจากในระดับนี้ข้อมูลจะไม่เปลี่ยนรูป


5
ฉันอาจจะเขียนสิ่งนี้เป็นmatrix = [[0]*cols for _ in range(rows)]
Shital Shah

12

วิธีประกาศเมทริกซ์ของศูนย์ (อัน):

numpy.zeros((x, y))

เช่น

>>> numpy.zeros((3, 5))
    array([[ 0.,  0.,  0.,  0.,  0.],
   [ 0.,  0.,  0.,  0.,  0.],
   [ 0.,  0.,  0.,  0.,  0.]])

หรือ numpy.ones ((x, y)) เช่น

>>> np.ones((3, 5))
array([[ 1.,  1.,  1.,  1.,  1.],
   [ 1.,  1.,  1.,  1.,  1.],
   [ 1.,  1.,  1.,  1.,  1.]])

แม้แต่สามมิติก็เป็นไปได้ ( http://www.astro.ufl.edu/~warner/prog/python.htmlดู -> อาร์เรย์หลายมิติ)


12

นี่คือวิธีที่ฉันมักจะสร้างอาร์เรย์ 2 มิติในหลาม

col = 3
row = 4
array = [[0] * col for _ in range(row)]

ฉันพบว่ารูปแบบนี้ง่ายต่อการจดจำเมื่อเปรียบเทียบกับการใช้สองลูปสำหรับความเข้าใจในรายการ


11

ฉันใช้สคริปต์ Python ตัวแรกของฉันและฉันสับสนเล็กน้อยจากตัวอย่างตารางเมทริกซ์ดังนั้นฉันหวังว่าตัวอย่างด้านล่างจะช่วยให้คุณประหยัดเวลา:

 # Creates a 2 x 5 matrix
 Matrix = [[0 for y in xrange(5)] for x in xrange(2)]

ดังนั้น

Matrix[1][4] = 2 # Valid
Matrix[4][1] = 3 # IndexError: list index out of range

10

ใช้ NumPy คุณสามารถเริ่มต้นเมทริกซ์ที่ว่างเปล่าเช่นนี้

import numpy as np
mm = np.matrix([])

และต่อท้ายข้อมูลแบบนี้ต่อท้าย:

mm = np.append(mm, [[1,2]], axis=1)

อะไรคือข้อดีข้อเสียของการใช้ numpy แทนที่จะเป็น "list comprehension"?
Revolucion สำหรับ Monica

7

ฉันอ่านไฟล์ที่คั่นด้วยเครื่องหมายจุลภาคดังนี้:

data=[]
for l in infile:
    l = split(',')
    data.append(l)

รายการ "data" นั้นเป็นรายการของรายการที่มีข้อมูลดัชนี [row] [col]


7

หากคุณต้องการที่จะคิดว่ามันเป็นอาร์เรย์ 2 มิติแทนที่จะถูกบังคับให้คิดในรายการของรายการ (เป็นธรรมชาติมากขึ้นในความคิดของฉัน) คุณสามารถทำสิ่งต่อไปนี้:

import numpy
Nx=3; Ny=4
my2Dlist= numpy.zeros((Nx,Ny)).tolist()

ผลลัพธ์คือรายการ (ไม่ใช่อาร์เรย์ NumPy) และคุณสามารถเขียนทับตำแหน่งแต่ละตำแหน่งด้วยตัวเลขสตริงหรืออะไรก็ได้


มีความnumpy.matrixคิดเป็นnumpy.zerosโดยไม่ต้องศูนย์โดยไม่ต้องเป็นรายการ?
Revolucion สำหรับ Monica

6

นั่นคือสิ่งที่พจนานุกรมทำขึ้นมา!

matrix = {}

คุณสามารถกำหนดคีย์และค่าได้สองวิธี:

matrix[0,0] = value

หรือ

matrix = { (0,0)  : value }

ผลลัพธ์:

   [ value,  value,  value,  value,  value],
   [ value,  value,  value,  value,  value],
   ...

6

ใช้:

import copy

def ndlist(*args, init=0):
    dp = init
    for x in reversed(args):
        dp = [copy.deepcopy(dp) for _ in range(x)]
    return dp

l = ndlist(1,2,3,4) # 4 dimensional list initialized with 0's
l[0][1][2][3] = 1

ฉันคิดว่า NumPy เป็นวิธีที่จะไป ด้านบนเป็นตัวเลือกทั่วไปถ้าคุณไม่ต้องการใช้ NumPy


ฉันชอบความพยายามทำสิ่งที่ง่าย ๆ กับวานิลลา Python โดยไม่ต้องใช้ numpy
Rick Henderson

4

โดยใช้รายการ:

matrix_in_python  = [['Roy',80,75,85,90,95],['John',75,80,75,85,100],['Dave',80,80,80,90,95]]

โดยใช้ dict: คุณยังสามารถเก็บข้อมูลนี้ไว้ในตารางแฮชเพื่อการค้นหาที่รวดเร็ว

matrix = { '1':[0,0] , '2':[0,1],'3':[0,2],'4' : [1,0],'5':[1,1],'6':[1,2],'7':[2,0],'8':[2,1],'9':[2,2]};

เมทริกซ์ ['1'] จะให้ผลลัพธ์เป็นเวลา O (1)

* nb : คุณต้องจัดการกับการชนในตารางแฮช


4

หากคุณไม่มีข้อมูลขนาดก่อนเริ่มต้นให้สร้างรายการหนึ่งมิติสองรายการ

list 1: To store rows
list 2: Actual two-dimensional matrix

จัดเก็บทั้งแถวในรายการที่ 1 เมื่อเสร็จแล้วให้เพิ่มรายการ 1 ลงในรายการ 2:

from random import randint

coordinates=[]
temp=[]
points=int(raw_input("Enter No Of Coordinates >"))
for i in range(0,points):
    randomx=randint(0,1000)
    randomy=randint(0,1000)
    temp=[]
    temp.append(randomx)
    temp.append(randomy)
    coordinates.append(temp)

print coordinates

เอาท์พุท:

Enter No Of Coordinates >4
[[522, 96], [378, 276], [349, 741], [238, 439]]

3
# Creates a list containing 5 lists initialized to 0
Matrix = [[0]*5]*5

ระวังเกี่ยวกับการแสดงออกสั้น ๆ นี้ดูคำอธิบายแบบเต็มในคำตอบของ @ FJ


19
โปรดใช้ความระมัดระวังในลักษณะนี้เพราะMatrix[0], Matrix[1], ..., Matrix[4]ทุกจุดไปยังอาร์เรย์เดียวกันดังนั้นหลังจากที่คุณคาดหวังMatrix[0][0] = 3 Matrix[0][0] == Matrix[1][0] == ... == Matrix[4][0] == 3
gongzhitaao

1
ขอบคุณ gongzhitaao สำหรับความคิดเห็นของคุณ ถ้าฉันอ่านมันอีกแล้วมันจะช่วยฉันอย่างน้อยครึ่งชั่วโมง .. การมีเมทริกซ์ที่แต่ละแถวชี้ไปที่สถานที่เดียวกันในความทรงจำดูเหมือนจะไม่มีประโยชน์มากและถ้าคุณไม่รู้ว่าคุณกำลังทำอะไรอยู่ มันอันตรายนะ! ฉันค่อนข้างแน่ใจว่านี่ไม่ใช่สิ่งที่ Masoud Abasian ผู้ถามคำถามอยากทำ
เอเดรียน

7
คุณควรลบคำตอบนี้เนื่องจากคำตอบนั้นไม่ถูกต้อง ผู้เริ่มต้นอาจสับสน
cxxl

2
คุณหมายถึงคำตอบอะไร ฉันไม่เห็นผู้ใช้ที่ชื่อ "FJ" (ไม่ใช่คำตอบที่ถูกลบ)
ปีเตอร์มอร์เทนเซ่น

3
l=[[0]*(L) for _ in range(W)]

จะเร็วกว่า:

l = [[0 for x in range(L)] for y in range(W)] 

2
คำตอบซ้ำหนึ่งคำตอบแล้วด้านล่าง ก็[[0]*(L) for i in range(W)]ควรจะเป็น[[0]*(L) for _ in range(W)]เพราะiไม่ได้ใช้ทุกที่
Ayush Vatsyayan

2

คุณสามารถสร้างรายการสองมิติที่ว่างเปล่าได้โดยการซ้อนปีกสี่เหลี่ยมสองตัวหรือมากกว่าหรือวงเล็บสาม ( []โดยคั่นด้วยเครื่องหมายจุลภาค) ด้วยการค้ำยันสี่เหลี่ยมเช่นเดียวกับด้านล่าง:

Matrix = [[], []]

ตอนนี้สมมติว่าคุณต้องการผนวก 1 Matrix[0][0]จากนั้นคุณพิมพ์:

Matrix[0].append(1)

ตอนนี้ให้พิมพ์ Matrix แล้วกด Enter ผลลัพธ์จะเป็น:

[[1], []]


1

ในกรณีที่คุณต้องการเมทริกซ์ที่มีตัวเลขที่กำหนดไว้ล่วงหน้าคุณสามารถใช้รหัสต่อไปนี้:

def matrix(rows, cols, start=0):
    return [[c + start + r * cols for c in range(cols)] for r in range(rows)]


assert matrix(2, 3, 1) == [[1, 2, 3], [4, 5, 6]]

1

นี่คือข้อมูลโค้ดสำหรับสร้างเมทริกซ์ในไพ ธ อน:

# get the input rows and cols
rows = int(input("rows : "))
cols = int(input("Cols : "))

# initialize the list
l=[[0]*cols for i in range(rows)]

# fill some random values in it
for i in range(0,rows):
    for j in range(0,cols):
        l[i][j] = i+j

# print the list
for i in range(0,rows):
    print()
    for j in range(0,cols):
        print(l[i][j],end=" ")

กรุณาแนะนำถ้าฉันพลาดบางสิ่งบางอย่าง

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