คุณจะแบ่งแต่ละองค์ประกอบในรายการด้วย int ได้อย่างไร?


154

ฉันแค่ต้องการหารแต่ละองค์ประกอบในรายการด้วย int

myList = [10,20,30,40,50,60,70,80,90]
myInt = 10
newList = myList/myInt

นี่เป็นข้อผิดพลาด:

TypeError: unsupported operand type(s) for /: 'list' and 'int'

ฉันเข้าใจว่าทำไมฉันจึงได้รับข้อผิดพลาดนี้ แต่ฉันรู้สึกท้อแท้ที่หาทางออกไม่ได้

พยายามด้วย:

newList = [ a/b for a, b in (myList,myInt)]

ข้อผิดพลาด:

ValueError: too many values to unpack

ผลลัพธ์ที่คาดหวัง:

newList = [1,2,3,4,5,6,7,8,9]


แก้ไข:

รหัสต่อไปนี้ให้ผลลัพธ์ตามที่คาดหวัง:

newList = []
for x in myList:
    newList.append(x/myInt)

แต่มีวิธีที่ง่ายกว่า / เร็วกว่าในการทำเช่นนี้?

คำตอบ:


233

วิธีใช้สำนวนคือการใช้ list comprehension:

myList = [10,20,30,40,50,60,70,80,90]
myInt = 10
newList = [x / myInt for x in myList]

หรือถ้าคุณต้องการที่จะรักษาการอ้างอิงไปยังรายการเดิม:

myList[:] = [x / myInt for x in myList]

1
กำหนดขนาดรายการแบบคงที่ทั้งสองวิธีจะเร็วกว่า [mylist [0] / myint, mylist [1] / myint]
user-2147482637

7
@ user1938107 แทบจะไม่แน่นอน แต่นี่ก็เป็นประเภทของการเพิ่มประสิทธิภาพขนาดเล็กที่คุณควรหลีกเลี่ยงต่อไป
Soulcheck

75

วิธีที่คุณลองก่อนเป็นไปได้โดยตรงกับnumpy :

import numpy
myArray = numpy.array([10,20,30,40,50,60,70,80,90])
myInt = 10
newArray = myArray/myInt

หากคุณดำเนินการดังกล่าวด้วยรายการที่มีความยาวและโดยเฉพาะอย่างยิ่งในโครงการคำนวณทางวิทยาศาสตร์ทุกประเภทฉันขอแนะนำให้ใช้งาน numpy


4
ฉันรู้ว่านี่เป็นคำตอบเก่า แต่สำหรับทุกคนที่ยังอ่านมัน: โปรดจำไว้ว่าเมื่อใช้ numpy.array คุณควรระบุประเภทของตัวอย่างnumpy.array([10,20,30,40,50,60,70,80,90], dtype='f')สำหรับ loat มิฉะนั้นหารด้วย 3 จะให้คุณเพียง 3 เป็นผลแทน .. ที่ 3.333
ริชาร์ด Boonen

3
@RichardBoonen ในกรณีนี้ OP ต้องการแบ่ง int แต่ถ้าคุณต้องการแบ่งทศนิยมคุณถูกต้องคุณต้องระบุชนิดเป็นจำนวนเต็ม หรือวางทุ่นเดียวในรายการ:numpy.array([10.,20,30,40,50,60,70,80,90])
silvado

24
>>> myList = [10,20,30,40,50,60,70,80,90]
>>> myInt = 10
>>> newList = map(lambda x: x/myInt, myList)
>>> newList
[1, 2, 3, 4, 5, 6, 7, 8, 9]

คุณคิดว่าแผนที่ดีกว่ารายการความเข้าใจในกรณีนี้หรือไม่? ฉันแค่สงสัยว่าฉันจะไปเพื่อความเข้าใจในรายการเพราะมันง่ายต่อการอ่าน
Andrew Cox

@AndrewCox ฉันชอบแผนที่ (มาจากพื้นหลังแบบหลาม) รายการความเข้าใจดูเหมือนจะสะอาดกว่าสำหรับฉันเช่นกันดังนั้นคุณควรไปด้วย
Dogbert

คุณรู้หรือไม่ว่านี่เป็นวิธีที่เร็วกว่าการตรวจสอบและการลงรายการบัญชี berkantk?
Casa

@Casa: คนที่ผ่านการทดสอบนี้ที่stackoverflow.com/q/1247490 ข้อสรุปน่าจะเป็นที่รายการความเข้าใจชนะในกรณีนี้โดยเฉพาะ
ไบรอัน

4
ปัจจุบันผลตอบแทนวัตถุแผนที่ดังนั้นหากคุณต้องการรายชื่อที่คุณต้องพูดอย่างชัดเจนmap() list()ดังนั้นในกรณีนี้:newList = list(map(lambda x: x/myInt, myList))
robertmartin8


6

เวอร์ชั่นนามธรรมสามารถ:

import numpy as np
myList = [10, 20, 30, 40, 50, 60, 70, 80, 90]
myInt = 10
newList  = np.divide(myList, myInt)

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