将附加函数映射到列表
我想优雅地进行以下操作。我有一个列表:将附加函数映射到列表
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
。我想我可以做一个循环,但这似乎更优雅,有没有一种方法来正确映射?
这里是实现几种方法你想要什么:
更具可读性和经典的方式
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
时,你会得到新的列表对象,在这种情况下,每个项目的新列表对象。
我不同意列表理解方法在这里是一个很好的选择,即使我们引入了一些“if”条件。表达式'el + [1]'不会追加到现有的列表中,而是从'el'和'[1]'创建一个全新的列表。对于'list1'的大型元素,这会占用比所需更多的内存,并且大部分时间将用于复制。一个简单的for循环与if语句将是最好的选择。 –
@jmd_dk这里是哪里?我提供了为每个案例作出解释,只有他可以决定什么是最适合他的。在我看来,这里就足够使用简单的'for'了。接下来,如果作者不处理大量数据,那么您告诉的内容并不重要。我试图说的一切,取决于情况和要求。 – Reishin
尝试列表理解,利用添加列表将它们连接在一起的事实。
new_list = [l + [1] for l in list1]
可以根本就
list1 = [[1,2],[3,1,4,7],[5],[7,8]]
for el in list1:
el.append(1)
是的,这就是我的意思是“我想我可以用循环做到这一点”。 :) –
map(lambda x: x + [1], list1)
你的意思呢?
list.append()没有返回(平均总是返回None)
随着列表理解和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]]
For循环很好。如果你真正想要的是'.append',这是一个就地变异,那么Map是完全错误的。 –
@DarraghEnright这是非常糟糕的做法。列表推导是一个功能性构造,而且你正在将状态变化与功能构造混合在一起,这只是一种糟糕的形式。 –
用'map'混合'append'就地变异是优雅的** ** **。 –