Làm thế nào để thêm một số nguyên cho mỗi phần tử trong danh sách?


135

Nếu tôi có list=[1,2,3]và tôi muốn thêm 1vào từng phần tử để có đầu ra [2,3,4], tôi sẽ làm thế nào?

Tôi giả sử tôi sẽ sử dụng một vòng lặp for nhưng không chắc chắn chính xác như thế nào.

Câu trả lời:


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

6
Bài nói chuyện này giải thích nó: Sự thật và Huyền thoại về Tên và Giá trị của Python: nedbatchelder.com/text/names1.html
Ned Batchelder

Thông tin tuyệt vời. Mở rộng tầm mắt.
Daniel Springer

3
@DaniSpringer Vì bạn không gán cho danh sách. Nó giống như làm lst = [1, 2, 3]; e = lst[0]; e += 1. ekhông có bất kỳ thông tin nào về nguồn gốc của nó, nó chỉ là một biến mà một yếu tố của danh sách đã được gán. Sau khi gán một cái gì đó khác cho nó, danh sách lstsẽ không thay đổi.
Błażej Michalik

Vâng, câu trả lời này trông rất giống với tôi.
Daniel Springer

và phóng viên lười biếng tính toán một:new_list = (x+1 for x in my_list)
Eduardo Pignatelli


24

Các câu trả lời khác về hiểu danh sách có lẽ là đặt cược tốt nhất cho phép cộng đơn giản, nhưng nếu bạn có một hàm phức tạp hơn mà bạn cần áp dụng cho tất cả các yếu tố thì bản đồ có thể phù hợp.

Trong ví dụ của bạn, nó sẽ là:

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

7
map(1 .__add__, ...)làm việc quá Lưu ý rằng bạn cần một khoảng trắng giữa 1.để ngăn trình phân tích cú pháp nghĩ rằng đó là một số float
John La Rooy

15

Nếu bạn muốn sử dụng numpy, có một phương pháp khác như sau

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

13

Chỉnh sửa: đây không phải là tại chỗ

Trước hết, đừng sử dụng từ 'danh sách' cho biến của bạn. Nó làm mờ từ khóa list.

Cách tốt nhất là thực hiện tại chỗ bằng cách sử dụng nối, lưu ý [:]biểu thị một mối nối:

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

4
Điều này tốt cho việc thay đổi danh sách hiện có, nhưng nó vẫn tạo ra một danh sách mới. Có phải bằng cách nào đó không an toàn để sử dụng một trình tạo để tránh việc tạo danh sách không cần thiết? Ví dụ _list[:]=(i+1 for i in _list).
Alan

mà vẫn tạo ra một danh sách mới, không thể thực hiện nó ngay tại chỗ mà không có vòng lặp for tôi không nghĩ
robert king

Tại sao bạn nghĩ _list[:]=(i+1 for i in _list)tạo ra một danh sách mới?
Alan

Ý tôi là, nó đã được đưa ra, nhưng tạm thời nó sẽ tạo ra một danh sách hoàn toàn mới cho các rhs. Xem những câu trả lời sau: stackoverflow.com/questions/4948293/ Thẻ stackoverflow.com/questions/11877212/
Kẻ

Tôi hiểu ý bạn là gì. Gọi trình tự tạm thời một danh sách làm tôi bối rối. Chúng ta có thực sự biết bất cứ điều gì về loại của nó? Điều đó sẽ không được thực hiện cụ thể?
Alan

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

Ý định của tôi ở đây là để lộ nếu mục trong danh sách là một số nguyên mà nó hỗ trợ các hàm dựng sẵn khác nhau.


7

Python 2+:

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

Python 3+:

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


2

Đi qua một cách không hiệu quả, nhưng độc đáo để làm điều đó. Vì vậy, chia sẻ nó trên khắp. Và có, nó đòi hỏi thêm không gian cho một danh sách khác.

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]

"thêm" đến từ đâu?
hahnec

thêm nên nhập từ các nhà khai thác,from operator import add
Rajith Thennakoon

0
list = [1,2,3,4,5]

for index in range(5):
      list[index] = list[index] +1

print(list)

0

Nhiều câu trả lời ở trên là rất tốt. Tôi cũng đã thấy một số câu trả lời kỳ lạ sẽ thực hiện công việc. Ngoài ra, câu trả lời cuối cùng được nhìn thấy là thông qua một vòng lặp bình thường. Sự sẵn sàng đưa ra câu trả lời này dẫn tôi đến itertoolsnumpy, sẽ làm cùng một công việc theo một cách khác.

Ở đây tôi trình bày các cách khác nhau để thực hiện công việc, không được trả lời ở trên.

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)

Đầu ra

>>> <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)

Lý do duy nhất của tôi để làm nổi bật việc sử dụng numpylà người ta phải luôn luôn thực hiện các thao tác như vậy với các thư viện như numpy vì nó có hiệu suất hiệu quả cho các mảng rất lớn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.