2016-12-01 112 views
0

我想优雅地进行以下操作。我有一个列表:将附加函数映射到列表

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。我想我可以做一个循环,但这似乎更优雅,有没有一种方法来正确映射?

+0

For循环很好。如果你真正想要的是'.append',这是一个就地变异,那么Map是完全错误的。 –

+0

@DarraghEnright这是非常糟糕的做法。列表推导是一个功能性构造,而且你正在将状态变化与功能构造混合在一起,这只是一种糟糕的形式。 –

+1

用'map'混合'append'就地变异是优雅的** ** **。 –

回答

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> 40时添加item,那么您可以考虑使用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你可以附加到现有 o该列表对于执行时间和内存使用量的影响要小得多。当你使用List comprehension时,你会得到新的列表对象,在这种情况下,每个项目的新列表对象。

+0

我不同意列表理解方法在这里是一个很好的选择,即使我们引入了一些“if”条件。表达式'el + [1]'不会追加到现有的列表中,而是从'el'和'[1]'创建一个全新的列表。对于'list1'的大型元素,这会占用比所需更多的内存,并且大部分时间将用于复制。一个简单的for循环与if语句将是最好的选择。 –

+0

@jmd_dk这里是哪里?我提供了为每个案例作出解释,只有他可以决定什么是最适合他的。在我看来,这里就足够使用简单的'for'了。接下来,如果作者不处理大量数据,那么您告诉的内容并不重要。我试图说的一切,取决于情况和要求。 – Reishin

0

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

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

可以根本就

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

是的,这就是我的意思是“我想我可以用循环做到这一点”。 :) –

0
map(lambda x: x + [1], list1) 

你的意思呢?

list.append()没有返回(平均总是返回None)

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]]