สร้างรายการเปล่าในหลามด้วยขนาดที่แน่นอน


545

ฉันต้องการสร้างรายการที่ว่างเปล่า (หรืออะไรก็ตามที่เป็นวิธีที่ดีที่สุด) ที่สามารถเก็บองค์ประกอบได้ 10 รายการ

หลังจากนั้นฉันต้องการกำหนดค่าในรายการนั้นตัวอย่างเช่นควรจะแสดง 0 ถึง 9:

s1 = list();
for i in range(0,9):
   s1[i] = i

print  s1

แต่เมื่อฉันเรียกใช้รหัสนี้มันสร้างข้อผิดพลาดหรือในกรณีอื่นมันเพิ่งแสดง[](ว่าง)

มีคนอธิบายได้ไหม



7
“ รายการที่ว่างเปล่า” ( []) โดยนิยามมีองค์ประกอบเป็นศูนย์ สิ่งที่คุณเห็นได้ชัดว่าต้องการคือรายการของค่า falsy เช่นNone, หรือ0 ''
dan04

เพื่อสร้างรายการจาก0การ9ที่คุณควรใช้จริงซึ่งหมายความว่าfor i in range(0, 10) for (int i = 0, i < 10, i++)
Atcold

คำตอบ:


830

คุณไม่สามารถกำหนดให้กับรายการที่ชอบlst[i] = somethingเว้นแต่ว่ารายการนั้นจะเริ่มต้นได้ด้วยi+1องค์ประกอบอย่างน้อย คุณต้องใช้ผนวกเพื่อเพิ่มองค์ประกอบในตอนท้ายของรายการ lst.append(something).

(คุณสามารถใช้สัญกรณ์มอบหมายถ้าคุณใช้พจนานุกรม)

สร้างรายการว่างเปล่า:

>>> l = [None] * 10
>>> l
[None, None, None, None, None, None, None, None, None, None]

การกำหนดค่าให้กับองค์ประกอบที่มีอยู่ของรายการด้านบน:

>>> l[1] = 5
>>> l
[None, 5, None, None, None, None, None, None, None, None]

โปรดทราบว่าสิ่งที่ต้องการl[15] = 5จะยังคงล้มเหลวเนื่องจากรายการของเรามีเพียง 10 องค์ประกอบ

range (x) สร้างรายการจาก [0, 1, 2, ... x-1]

# 2.X only. Use list(range(10)) in 3.X.
>>> l = range(10)
>>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

การใช้ฟังก์ชั่นเพื่อสร้างรายการ:

>>> def display():
...     s1 = []
...     for i in range(9): # This is just to tell you how to create a list.
...         s1.append(i)
...     return s1
... 
>>> print display()
[0, 1, 2, 3, 4, 5, 6, 7, 8]

รายการความเข้าใจ (การใช้กำลังสองเพราะในช่วงที่คุณไม่จำเป็นต้องทำทั้งหมดคุณสามารถส่งคืนได้range(0,9)):

>>> def display():
...     return [x**2 for x in range(9)]
... 
>>> print display()
[0, 1, 4, 9, 16, 25, 36, 49, 64]

17
คุณหมายถึงอะไรโดย "คุณไม่สามารถกำหนดให้กับรายการเช่น lst [i] = some" - แน่นอนคุณทำได้! สิ่งที่คุณไม่สามารถทำได้คือการกำหนดให้กับองค์ประกอบที่ไม่มีอยู่จริงเกินกว่าความยาวของรายการปัจจุบัน
Sergey

5
"เว้นแต่ว่ารายการจะเริ่มต้นได้แล้วด้วยองค์ประกอบ i + 1 อย่างน้อย" ...
MrR

5
คุณสามารถทำได้:a = [0 for _ in range(10)]
Kamiar

เป็นไปได้ไหมที่จะใช้ฟังก์ชัน list ()?
Raul Chiarella

125

ลองใช้สิ่งนี้แทน:

lst = [None] * 10

ด้านบนจะสร้างรายการขนาด 10 โดยที่แต่ละตำแหน่งเริ่มต้นNoneได้ หลังจากนั้นคุณสามารถเพิ่มองค์ประกอบเข้าไปได้:

lst = [None] * 10
for i in range(10):
    lst[i] = i

เป็นที่ยอมรับว่าไม่ใช่วิธี Pythonic ในการทำสิ่งต่างๆ ทำสิ่งนี้ดีกว่า:

lst = []
for i in range(10):
    lst.append(i)

หรือแม้แต่ง่ายกว่าใน Python 2.x คุณสามารถทำสิ่งนี้เพื่อเริ่มต้นรายการด้วยค่าตั้งแต่ 0 ถึง 9:

lst = range(10)

และใน Python 3.x:

lst = list(range(10))

2
อีกสิ่งที่ยอดเยี่ยมเกี่ยวกับเรื่องนี้คือคุณสามารถเริ่มต้นรายการที่มีค่าเริ่มต้น lst = [''] * 10หรือlst = [0] * 10
Anthony Manning-Franklin

2
ตัวแปรในตัวอย่างความเข้าใจ arr = [None for _ in range(10)]ถ้าองค์ประกอบทั้งหมดในความต้องการอาร์เรย์จะว่างเปล่าที่เริ่มต้นใช้:
Doug R.

85

คำตอบที่ยอมรับในปัจจุบันของ varunl

 >>> l = [None] * 10
 >>> l
 [None, None, None, None, None, None, None, None, None, None]

ทำงานได้ดีสำหรับประเภทที่ไม่อ้างอิงเช่นตัวเลข น่าเสียดายถ้าคุณต้องการสร้างรายการของรายการคุณจะพบข้อผิดพลาดในการอ้างอิง ตัวอย่างใน Python 2.7.6:

>>> a = [[]]*10
>>> a
[[], [], [], [], [], [], [], [], [], []]
>>> a[0].append(0)
>>> a
[[0], [0], [0], [0], [0], [0], [0], [0], [0], [0]]
>>> 

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

def init_list_of_objects(size):
    list_of_objects = list()
    for i in range(0,size):
        list_of_objects.append( list() ) #different object reference each time
    return list_of_objects


>>> a = init_list_of_objects(10)
>>> a
[[], [], [], [], [], [], [], [], [], []]
>>> a[0].append(0)
>>> a
[[0], [], [], [], [], [], [], [], [], []]
>>> 

อาจเป็นไปได้ว่าเป็นวิธีการเริ่มต้นของงูหลามในตัว (แทนที่จะเขียนฟังก์ชั่น) แต่ฉันไม่แน่ใจว่ามันคืออะไร ยินดีที่จะได้รับการแก้ไข!

แก้ไข: มัน [ [] for _ in range(10)]

ตัวอย่าง:

>>> [ [random.random() for _ in range(2) ] for _ in range(5)]
>>> [[0.7528051908943816, 0.4325669600055032], [0.510983236521753, 0.7789949902294716], [0.09475179523690558, 0.30216475640534635], [0.3996890132468158, 0.6374322093017013], [0.3374204010027543, 0.4514925173253973]]

19
ฉันได้ยินมาว่าการใช้appendบ่อยครั้งน้อยกว่าจะเขียนความเข้าใจ [ [] for _ in range(10)]คุณสามารถสร้างรายชื่อของรายการผ่านทาง
M.Herzkamp

10
โหวตขึ้นเพราะฉันเริ่มโกรธเพราะฉันมีอาเรย์หลายมิติที่มีข้อมูลเดียวกันซ้ำหลายครั้งและไม่สามารถคิดได้ว่าเกิดอะไรขึ้นก่อนที่จะหาคำตอบนี้ในที่สุด ^^ ฉันไม่เข้าใจว่าทำไมมันถึงต่ำมากที่นี่
Bregalad

19

คุณสามารถไปที่รายการเช่น:.append(element) s1.append(i)สิ่งที่คุณกำลังพยายามทำอยู่คือเข้าถึงองค์ประกอบ ( s1[i]) ที่ไม่มีอยู่


16

มีวิธี "ด่วน" สองวิธี:

x = length_of_your_list
a = [None]*x
# or
a = [None for _ in xrange(x)]

ดูเหมือนว่า[None]*xจะเร็วกว่า:

>>> from timeit import timeit
>>> timeit("[None]*100",number=10000)
0.023542165756225586
>>> timeit("[None for _ in xrange(100)]",number=10000)
0.07616496086120605

แต่ถ้าคุณโอเคกับช่วง (เช่น[0,1,2,3,...,x-1]) ก็range(x)อาจเร็วที่สุด:

>>> timeit("range(100)",number=10000)
0.012513160705566406

ทราบว่าใน Python3 คุณจะต้องใช้list(range(n))แทนเป็นrange()ไม่ได้กลับรายการ แต่เป็น iterator [None] * nและที่ไม่ได้เร็วกว่า
Skillmon ชอบ topanswers.xyz

10

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

x = [[] for i in range(10)]

7
ความแตกต่างที่สำคัญที่สุดระหว่างทำข้างต้นเทียบกับการทำx = [[]] * 10ก็คือว่าในระยะหลังองค์ประกอบในแต่ละรายการจะชี้ไปยังวัตถุรายการเดียวกัน ดังนั้นถ้าคุณไม่ต้องการเพียงแค่ 10 สำเนาของวัตถุเดียวกันให้ใช้rangeตัวแปรพื้นฐานที่สร้างวัตถุใหม่ 10 ชิ้น ฉันพบความแตกต่างนี้สำคัญมาก
Mandeep Sandhu

6

(สิ่งนี้เขียนขึ้นตามคำถามดั้งเดิมของคำถาม)

ฉันต้องการสร้างรายการที่ว่างเปล่า (หรืออะไรก็ตามที่เป็นวิธีที่ดีที่สุด) สามารถถือ 10 องค์ประกอบ

รายการทั้งหมดสามารถเก็บองค์ประกอบได้มากเท่าที่คุณต้องการภายใต้ขีด จำกัด ของหน่วยความจำที่มีอยู่เท่านั้น "ขนาด" เท่านั้นของรายการที่มีความสำคัญคือจำนวนองค์ประกอบในปัจจุบัน

แต่เมื่อฉันเรียกใช้ผลลัพธ์จะเป็น []

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

การโทรdisplayไม่ได้แก้ไขรายการที่คุณส่งผ่านตามที่เขียนไว้ รหัสของคุณบอกว่า " s1เป็นชื่อสำหรับสิ่งใด ๆ ที่ถูกส่งผ่านไปยังฟังก์ชั่นที่; ok ตอนนี้สิ่งแรกที่เราจะทำคือลืมเกี่ยวกับสิ่งที่สมบูรณ์และให้s1เริ่มต้นหมายแทนเพื่อที่สร้างขึ้นใหม่listตอนนี้เราจะปรับเปลี่ยน. list" สิ่งนี้ไม่มีผลกับค่าที่คุณส่งผ่าน

ไม่มีเหตุผลที่จะส่งผ่านค่าที่นี่ (ไม่มีเหตุผลที่แท้จริงในการสร้างฟังก์ชั่นอย่างใดอย่างหนึ่ง แต่ที่อยู่ด้านข้างจุด) คุณต้องการที่จะ "สร้าง" บางสิ่งบางอย่างเพื่อให้เป็นผลลัพธ์ของฟังก์ชั่นของคุณ ไม่มีข้อมูลจะต้องสร้างสิ่งที่คุณอธิบายจึงไม่ส่งข้อมูลใด ๆ ใน. ในการได้รับการออกข้อมูลreturnมัน

ที่จะให้สิ่งที่คุณต้องการ:

def display():
    s1 = list();
    for i in range(0, 9):
        s1[i] = i
    return s1

ปัญหาต่อไปที่คุณจะทราบคือรายการของคุณจะมีเพียง 9 องค์ประกอบเท่านั้นเนื่องจากจุดสิ้นสุดถูกข้ามโดยrangeฟังก์ชัน (เช่นเดียวกับด้านข้าง, ใช้[]งานได้ดีlist(), เซมิโคลอนไม่จำเป็น, s1เป็นชื่อที่ไม่ดีสำหรับตัวแปร, และจำเป็นต้องใช้พารามิเตอร์เพียงตัวเดียวเท่านั้นrangeถ้าคุณเริ่มจาก0) ดังนั้นคุณก็จบลงด้วย

def create_list():
    result = list()
    for i in range(10):
        result[i] = i
    return result

อย่างไรก็ตามสิ่งนี้ยังขาดเครื่องหมาย; rangeไม่ได้เป็นบางคำหลักที่มีมนต์ขลังที่เป็นส่วนหนึ่งของภาษาทางforและdefมี แต่แทนที่มันจะเป็นฟังก์ชั่น และเดาว่าฟังก์ชั่นนั้นส่งคืนอะไร? ถูกต้อง - รายการจำนวนเต็มเหล่านั้น ดังนั้นฟังก์ชั่นทั้งหมดจึงยุบลงไป

def create_list():
    return range(10)

และตอนนี้คุณเห็นว่าทำไมเราไม่จำเป็นต้องเขียนฟังก์ชั่นของตัวเองเลย; rangeเป็นฟังก์ชั่นที่เรามองหาอยู่แล้ว แม้ว่าอีกครั้งไม่มีความจำเป็นหรือเหตุผลในการ "ขนาดก่อนรายการ"


4

ฉันประหลาดใจเล็กน้อยที่วิธีที่ง่ายที่สุดในการสร้างรายการเริ่มต้นไม่ได้อยู่ในคำตอบใด ๆ เหล่านี้ เพียงใช้ตัวสร้างในlistฟังก์ชัน:

list(range(9))

1
ค่อนข้างสงสัยว่าทำไมทุกคนแสดงความคิดเห็นเกี่ยวกับสิ่งนี้ ... ฉันเป็นงูหลาม noob และฉันคนนี้ดูเหมือนว่าจะไป แต่ไม่มีใครพูดอะไรเลย บางทีฟังก์ชั่นช่วงอาจมีราคาแพงหรืออะไร?
AFP_555

3
ปัญหานี้คือคำตอบนี้ไม่ได้สร้างรายการเปล่าตามคำถามคุณจะพบกับ [0, 1, 2, 3, 4, 5, 6, 7, 8] ซึ่งเป็นสิ่งที่ฟังก์ชั่น range (9) ทำ . สมมติว่ารายการของ Nones มีประโยชน์มากกว่าที่จะเติมด้วยตัวเลขทันที
Spcogg ที่สอง

ทำไมห่อrange(9)ในlist()? ยังไม่range(9)ส่งคืนรายการใช่หรือไม่
Zyl

2
@Zyl rangeไม่ได้เป็นรายการหรือเครื่องกำเนิดไฟฟ้า มันเป็น subclass ที่ไม่เปลี่ยนรูปในSequenceตัว
Nuno André

@ AFP_555 ฉันคิดว่าคำถามจริงคือทำไมมันไม่ลดลงเพราะมันไม่ได้ตอบคำถามจริงๆและอาจมีผลกระทบที่ไม่ตั้งใจ
eric

4

วิธีง่ายๆในการสร้างเมทริกซ์ขนาด 2 มิติnโดยใช้ความเข้าใจในรายการแบบซ้อน:

m = [[None for _ in range(n)] for _ in range(n)]

1

นี่คือโค้ดของฉันสำหรับรายการ 2D ในหลามที่จะอ่านไม่ได้ ของแถวจากอินพุต:

empty = []
row = int(input())

for i in range(row):
    temp = list(map(int, input().split()))
    empty.append(temp)

for i in empty:
    for j in i:
        print(j, end=' ')
    print('')

-2

ฉันเจอคำถาม SO นี้ในขณะที่ค้นหาปัญหาที่คล้ายกัน ฉันต้องสร้างอาร์เรย์ 2D แล้วแทนที่องค์ประกอบบางส่วนของแต่ละรายการ (ในอาร์เรย์ 2D) ด้วยองค์ประกอบจาก dict จากนั้นผมก็มาในนี้เป็นปัญหาเพื่อที่ช่วยให้ฉันอาจจะนี้จะช่วยให้ผู้เริ่มต้นอื่น ๆ จะได้รับรอบ เคล็ดลับที่สำคัญคือการเริ่มต้นอาร์เรย์ 2 มิติเป็นอาร์เรย์ numpy แล้วใช้แทนarray[i,j]array[i][j]

สำหรับการอ้างอิงนี่คือส่วนของรหัสที่ฉันต้องใช้:

nd_array = []
for i in range(30):
    nd_array.append(np.zeros(shape = (32,1)))
new_array = []
for i in range(len(lines)):
    new_array.append(nd_array)
new_array = np.asarray(new_array)
for i in range(len(lines)):
    splits = lines[i].split(' ')
    for j in range(len(splits)):
        #print(new_array[i][j])
        new_array[i,j] = final_embeddings[dictionary[str(splits[j])]-1].reshape(32,1)

ตอนนี้ฉันรู้ว่าเราสามารถใช้ list comprehension ได้ แต่เพื่อความง่ายฉันใช้ nested for loop หวังว่านี่จะช่วยผู้อื่นที่เจอโพสต์นี้


-2

ทำให้สามารถใช้ซ้ำได้มากขึ้นเป็นฟังก์ชั่น

def createEmptyList(length,fill=None):
    '''
    return a (empty) list of a given length
    Example:
        print createEmptyList(3,-1)
        >> [-1, -1, -1]
        print createEmptyList(4)
        >> [None, None, None, None]
    '''
    return [fill] * length

-3
s1 = []
for i in range(11):
   s1.append(i)

print s1

หากต้องการสร้างรายการเพียงใช้วงเล็บเหล่านี้: "[]"

ในการเพิ่มรายการลงในรายการให้ใช้ list.append ()


-3

รหัสนี้สร้างอาร์เรย์ที่มีตัวเลขสุ่ม 10 ตัว

import random
numrand=[]
for i in range(0,10):
   a = random.randint(1,50)
   numrand.append(a)
   print(a,i)
print(numrand)

3
ยินดีต้อนรับสู่ SO คำตอบของคุณไม่ได้ตอบคำถามโดยเฉพาะ ลองดูที่stackoverflow.com/help/how-to-answer
Nick
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.