จะเพิ่มจำนวนเต็มให้กับแต่ละองค์ประกอบในรายการได้อย่างไร?


135

ถ้าฉันมีlist=[1,2,3]และต้องการเพิ่ม1ในแต่ละองค์ประกอบเพื่อให้ได้ผลลัพธ์[2,3,4]ฉันจะทำอย่างไร

ฉันคิดว่าฉันจะใช้ for loop แต่ไม่แน่ใจว่าเป็นอย่างไร

คำตอบ:


157
new_list = [x+1 for x in my_list]

6
คำพูดนี้อธิบาย: ข้อเท็จจริงและตำนานเกี่ยวกับชื่อและค่า Python: nedbatchelder.com/text/names1.html
Ned Batchelder

√ข้อมูลที่ยอดเยี่ยม เปิดตา
Daniel Springer

3
@DaniSpringer เพราะคุณไม่ได้กำหนดให้กับรายการ lst = [1, 2, 3]; e = lst[0]; e += 1มันเป็นเช่นเดียวกับการทำ eไม่มีข้อมูลว่ามาจากไหนเป็นเพียงตัวแปรที่กำหนดองค์ประกอบของรายการ หลังจากมอบหมายอย่างอื่นแล้วรายการlstจะไม่เปลี่ยนแปลง
Błażej Michalik

คำตอบนี้ดูคล้ายกับฉันมาก
Daniel Springer

และผู้สื่อข่าวขี้เกียจคำนวณหนึ่ง:new_list = (x+1 for x in my_list)
Eduardo Pignatelli


24

คำตอบอื่น ๆ เกี่ยวกับความเข้าใจในรายการอาจเป็นทางออกที่ดีที่สุดสำหรับการเพิ่มแบบง่ายๆ แต่ถ้าคุณมีฟังก์ชันที่ซับซ้อนมากขึ้นซึ่งคุณจำเป็นต้องใช้กับองค์ประกอบทั้งหมดแผนที่อาจจะเหมาะสม

ในตัวอย่างของคุณจะเป็น:

>>> map(lambda x:x+1, [1,2,3])
[2,3,4]

7
map(1 .__add__, ...)ได้ผลเช่นกัน โปรดทราบว่าคุณต้องมีช่องว่างระหว่าง1และ.เพื่อป้องกันไม่ให้ตัวแยกวิเคราะห์คิดว่าเป็นการลอย
John La Rooy

15

หากคุณต้องการใช้ numpy มีวิธีอื่นดังนี้

import numpy as np
list1 = [1,2,3]
list1 = list(np.asarray(list1) + 1)

13

แก้ไข: สิ่งนี้ไม่ได้อยู่ในสถานที่

อันดับแรกอย่าใช้คำว่า 'list' สำหรับตัวแปรของคุณ listมันเงาคำหลัก

วิธีที่ดีที่สุดคือทำในสถานที่โดยใช้ splicing สังเกต[:]หมายถึงรอยต่อ:

>>> _list=[1,2,3]
>>> _list[:]=[i+1 for i in _list]
>>> _list
[2, 3, 4]

4
นี่เป็นสิ่งที่ดีสำหรับการเปลี่ยนรายการที่มีอยู่ แต่ก็ยังสร้างรายการใหม่ การใช้เครื่องกำเนิดไฟฟ้าเพื่อหลีกเลี่ยงการสร้างรายการที่ไม่จำเป็นนั้นไม่ปลอดภัยหรือไม่? ได้แก่_list[:]=(i+1 for i in _list).
อลัน

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

ทำไมคุณคิดว่า_list[:]=(i+1 for i in _list)สร้างรายการใหม่
อลัน

ฉันหมายความว่ามันมีอยู่แล้ว แต่ชั่วคราวมันจะสร้างรายการใหม่ทั้งหมดสำหรับ rhs ดูคำตอบเหล่านี้: stackoverflow.com/questions/4948293/... stackoverflow.com/questions/11877212/...
โรเบิร์ตกษัตริย์

ฉันเข้าใจว่าคุณหมายถึงอะไร การเรียกลำดับชั่วคราวว่ารายการทำให้ฉันสับสน เรารู้อะไรเกี่ยวกับประเภทของมันหรือไม่? นั่นจะเป็นการใช้งานเฉพาะหรือไม่?
Alan

9
>>> [x.__add__(1) for x in [1, 3, 5]]
3: [2, 4, 6]

ความตั้งใจของฉันที่นี่คือการเปิดเผยว่ารายการในรายการเป็นจำนวนเต็มหรือไม่ซึ่งรองรับฟังก์ชันต่างๆในตัว




2

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

from operator import add
test_list1 = [4, 5, 6, 2, 10]
test_list2 = [1] * len(test_list1)

res_list = list(map(add, test_list1, test_list2))

print(test_list1)
print(test_list2)
print(res_list)

#### Output ####
[4, 5, 6, 2, 10]
[1, 1, 1, 1, 1]
[5, 6, 7, 3, 11]

"เพิ่ม" มาจากไหน?
hahnec

เพิ่มควรนำเข้าจากโอเปอเรเตอร์from operator import add
Rajith Thennakoon


0

หลาย ๆ คำตอบข้างบนดีมาก ฉันยังเห็นคำตอบแปลก ๆ ที่จะทำงานได้ดี นอกจากนี้คำตอบสุดท้ายที่เห็นคือการวนซ้ำปกติ ความเต็มใจที่จะให้คำตอบนี้ทำให้ฉันไปสู่itertoolsและnumpyซึ่งจะทำงานเดียวกันในลักษณะที่แตกต่างออกไป

ที่นี่ฉันนำเสนอวิธีต่างๆในการทำงาน แต่ไม่ได้ตอบไว้ข้างต้น

import operator
import itertools

x = [3, 5, 6, 7]

integer = 89

"""
Want more vairaint can also use zip_longest from itertools instead just zip
"""
#lazy eval
a = itertools.starmap(operator.add, zip(x, [89] * len(x))) # this is not subscriptable but iterable
print(a)
for i in a:
  print(i, end = ",")


# prepared list
a = list(itertools.starmap(operator.add, zip(x, [89] * len(x)))) # this returns list
print(a)



# With numpy (before this, install numpy if not present with `pip install numpy`)
import numpy

res = numpy.ones(len(x), dtype=int) * integer + x # it returns numpy array
res = numpy.array(x) + integer # you can also use this, infact there are many ways to play around
print(res)
print(res.shape) # prints structure of array, i.e. shape

# if you specifically want a list, then use tolist

res_list = res.tolist()
print(res_list)

เอาท์พุต

>>> <itertools.starmap object at 0x0000028793490AF0> # output by lazy val
>>> 92,94,95,96,                                     # output of iterating above starmap object
>>> [92, 94, 95, 96]                                 # output obtained by casting to list
>>>                   __
>>> # |\ | |  | |\/| |__| \ /
>>> # | \| |__| |  | |     |
>>> [92 94 95 96]                                    # this is numpy.ndarray object
>>> (4,)                                             # shape of array
>>> [92, 94, 95, 96]                                 # this is a list object (doesn't have a shape)

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

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