Как добавить целое число к каждому элементу списка?

135

Если у меня есть, list=[1,2,3]и я хочу добавить 1к каждому элементу, чтобы получить результат [2,3,4], как мне это сделать?

Я предполагаю, что использовал бы цикл for, но не знаю, как именно.

Деннис
источник

Ответы:

157
new_list = [x+1 for x in my_list]
Нед Бэтчелдер
источник
6
Этот доклад объясняет это: Факты и мифы об именах и ценностях Python: nedbatchelder.com/text/names1.html
Нед Батчелдер
√ Отличная информация. Открытие глаз.
Дэниел Спрингер,
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)
sushmit
источник
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).
Алан
который по-прежнему создает новый список, невозможно сделать это на месте без цикла for, я не думаю,
Роберт Кинг
Как вы думаете, почему _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]

Я намерен здесь показать, является ли элемент в списке целым числом, он поддерживает различные встроенные функции.

Kracekumar
источник
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]
satomacoto
источник
3
import numpy as np

np.add([1, 2, 3], 1).tolist()

который дает

[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]
Preetham
источник
откуда "добавить"?
hahnec
add должен импортировать из операторов,from operator import add
Раджит Тэннакун,
0
list = [1,2,3,4,5]

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

print(list)
Munchjax
источник
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 , потому что производительность эффективна для очень больших массивов.

Rushikesh
источник