将追加函数映射到列表

时间:2016-12-01 08:58:13

标签: python

我想优雅地做到以下几点。我有一个清单:

list1 = [[1,2],[3,1,4,7],[5],[7,8]]

我想将数字1附加到列表的每个元素,以便我有

list1 = [[1,2,1],[3,1,4,7,1],[5,1],[7,8,1]]

我正试图通过

来映射
map(list.append([1]), vectors)

但是这会返回错误append() takes exactly one argument (0 given),如果我只是尝试append([1])(没有list.),我会得到NameError: global name 'append' is not defined。我想我可以用循环来做,但这看起来更优雅,有没有办法正确映射?

5 个答案:

答案 0 :(得分:1)

以下是实现所需内容的几种方法:

更具可读性和经典方式

for el in list1:
  el.append(1)

列表理解

list1 = [el + [1] for el in list1]

发生器:

list1 = (el + [1] for el in list1)

地图

list1 = map(lambda el: el + [1], list1)

用什么?

这取决于您自己的情况,可能取决于执行速度优化,代码可读性,使用地点。

  • Map是可读性和执行速度最差的选择
  • For是一种最快速,更简单的方法
  • Generators只允许您在真正需要时生成新列表
  • List comprehension - 经典for的一个内线,当您需要使用if
  • 快速过滤新列表时,它会很有用

即。如果您只需要为每个项添加元素 - for循环是执行此操作的最佳选择,但如果您需要仅在item>时添加item 40,那么你可以考虑使用List comprehension

例如:

经典For

x = 41

for el in list1:
  if x > 40:
    el.append(x)

列表理解

   x = 1
   list1 = [el + [x] for el in list1 if x > 40]

正如@jmd_dk所提到的,在此示例中有一个基本区别:使用简单for,您只需附加到列表的现有对象,这对执行时间和内存使用情况。当您使用List comprehension时,您将获得新列表对象,在这种情况下,每个项目都会有新的列表对象。

答案 1 :(得分:0)

尝试列表理解,利用添加列表将它们连接在一起的事实。

new_list = [l + [1] for l in list1]

答案 2 :(得分:0)

你可以简单地做

list1 = [[1,2],[3,1,4,7],[5],[7,8]]
for el in list1:
    el.append(1)

答案 3 :(得分:0)

map(lambda x: x + [1], list1)
你的意思是?

list.append()没有返回(表示总是返回None)

答案 4 :(得分:0)

使用列表理解和append,您可以执行以下操作:

list1 = [[1, 2], [3, 1, 4, 7], [5], [7, 8]]

[item.append(1) for item in list1]
print(list1)  # Output: [[1, 2, 1], [3, 1, 4, 7, 1], [5, 1], [7, 8, 1]]

<强>输出:

>>> list1 = [[1, 2], [3, 1, 4, 7], [5], [7, 8]]
>>> [item.append(1) for item in list1]
[None, None, None, None]
>>> list1
[[1, 2, 1], [3, 1, 4, 7, 1], [5, 1], [7, 8, 1]]

您也可以像这样使用extend

[item.extend([1]) for item in list1]
print(list1)  # Output: [[1, 2, 1], [3, 1, 4, 7, 1], [5, 1], [7, 8, 1]]