如何为列表中的每个元素添加一个整数?


135

如果我有list=[1,2,3]并且想要添加1到每个元素以获取输出[2,3,4],我该怎么做?

我假设我会使用for循环,但不确定具体如何。

Answers:


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 += 1e没有关于它来自何处的任何信息,它只是一个已分配列表元素的变量。在为其分配其他内容后,列表lst将不会更改。
Błażej米哈利克

好吧,这个答案与我非常相似。
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 2012年

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)
艾伦(Alan)

那仍然会创建一个新列表,没有for循环就不可能就地执行它
罗伯特

您为什么认为_list[:]=(i+1 for i in _list)创建一个新列表?
艾伦

我的意思是,它已经到位,但暂时会为rhs创建一个全新的列表。见这些问题的答案: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 '19

添加应从运营商处导入,from operator import add
Rajith Thennakoon


0

上面的许多答案都很好。我也看到了一些奇怪的答案,可以胜任这项工作。另外,最后看到的答案是通过正常循环。这种愿意给出答案的意愿将我引向itertoolsnumpy,它们将以不同的方式完成相同的工作。

在这里,我介绍了完成此工作的不同方法,以上未作回答。

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之类的库进行此类操作,因为它对于大型数组而言性能高效。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.