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


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.