Як додати ціле число до кожного елемента у списку?


135

Якщо я маю list=[1,2,3]і хочу додати 1кожен елемент, щоб отримати вихід [2,3,4], то як би це зробити?

Я припускаю, що я би використовував цикл, але не знаю, як саме.

Відповіді:


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

6
Ця розмова пояснює це: факти та міфи про імена та цінності Python: nedbatchelder.com/text/names1.html
Ned Batchelder

Дивовижна інформація. Відкриття очей.
Даніель Спрінгер

3
@DaniSpringer Тому що ви не призначаєте до списку. Це те саме, що робити lst = [1, 2, 3]; e = lst[0]; e += 1. eне має жодної інформації про те, звідки вона походить, це лише змінна, якій було призначено елемент списку. Після присвоєння йому чогось іншого список lstне зміниться.
Błażej Michalik

Ну ця відповідь мені дуже схожа.
Даніель Спрінгер

і кореспондент ледачий обчислив один:new_list = (x+1 for x in my_list)
Едуардо Піньятеллі


24

Інші відповіді на розуміння списку, мабуть, найкраща ставка для простого додавання, але якщо у вас є більш складна функція, яку вам потрібно було застосувати до всіх елементів, то карта може бути гарною підходящою.

У вашому прикладі це було б:

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

7
map(1 .__add__, ...)працює теж. Зауважте, що вам потрібен пробіл між 1і, .щоб перешкодити парсеру думати, що це поплавок,
Джон Ла Руй

15

якщо ви хочете використовувати numpy, є інший метод наступним чином

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

13

Редагувати: це не на місці

По-перше, не використовуйте для своєї змінної слово "список". Це затінює ключове слово list.

Найкращий спосіб - це зробити на місці, використовуючи сплайсинг, зауважте, що [:]позначає зрощення:

>>> _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)створюється новий список?
Алан

Я маю на увазі, це на своєму місці, але тимчасово він створить зовсім новий список для резус. Дивіться відповіді: stackoverflow.com/questions/4948293/… stackoverflow.com/questions/11877212/…
Роберт Кінг

Я бачу, що ти маєш на увазі. Називання тимчасової послідовності списком мене збентежило. Чи насправді ми знаємо щось про його тип? Хіба це не буде конкретною реалізацією?
Алан

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

Я маю намір викрити, якщо елемент у списку є цілим числом, він підтримує різні вбудовані функції.


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

Потрапив не настільки ефективний, але унікальний спосіб зробити це. Таким чином, це спільний доступ. І так, це вимагає додаткового місця для іншого списку.

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
Раджит Тотнанкоун


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, оскільки це ефективність роботи для дуже великих масивів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.