为什么我不能在python中反转列表列表

时间:2010-09-25 16:05:23

标签: python list reverse map-function

我想做类似的事情,但是这段代码返回None列表(我认为这是因为list.reverse()正在反转列表):

map(lambda row: row.reverse(), figure)

我尝试了这个,但反过来返回一个迭代器:

map(reversed, figure)

最后我做了类似这样的事情,对我有用,但我不知道这是否是正确的解决方案:

def reverse(row):
    """func that reverse a list not in place"""
    row.reverse()
    return row

map(reverse, figure)

如果某人有更好的解决方案我不知道请告诉我

亲切的问候,

5 个答案:

答案 0 :(得分:27)

Python的可变容器的 mutator 方法(例如列表的.reverse方法)几乎总是返回None - 一些返回一个有用的值,例如.pop方法返回弹出元素,但要保留的关键概念是这些mutator都没有返回变异容器:而是容器突变就地并返回值mutator方法那个容器。 (这是CQS设计原则的应用 - 并不像埃菲尔那样狂热,Bertrand Meyer设计的语言也发明了CQS,但这只是因为在Python中“实用性超过了纯度,cfr import this; - )。

构建列表通常比构建迭代器更昂贵,对于绝大多数情况,你要做的只是 loop 的结果;因此,诸如reversed之类的内置函数(以及itertools模块中的所有精彩构建块)都会返回迭代器,不是列表。

但是如果你有一个迭代器x但真的需要等效的列表 y怎么办?一块蛋糕 - 只做y = list(x)。要创建类型为list的新实例,您调用类型list - 这是一个普遍的Python想法,它比保留非常重要的东西更重要我在前两段指出了! - )

因此,根据前几段中的关键概念,您的特定问题的代码非常容易组合在一起:

[list(reversed(row)) for row in figure]

请注意,我正在使用列表理解,不是 map:根据经验,map只应用作最后沟渠优化是没有需要一个lambda来构建它(如果涉及lambda那么listcomp,以及像往常一样更清晰,反正往往更快! - )。

一旦你成为“过去的Python大师”,如果你的分析告诉你这个代码是一个瓶颈,你就可以知道尝试其他方法,比如

[row[::-1] for row in figure]

应用负步切片(又名“火星笑脸”)制作行的反转副本,知道它通常比list(reversed(row))方法更快。但是 - 除非你的代码只能由你自己或至少熟练使用Python的人来维护 - 否则使用最简单的“第一原理代码”方法是一种可辩护的立场,除非分析告诉你按下踏板。 (就我个人而言,我认为“火星笑脸”非常重要,足以避免将这种优秀的一般哲学应用于这个特定的用例,但是,嘿,合理的人可能在这个非常具体的点上有所不同! - )。

答案 1 :(得分:8)

您还可以使用切片来反转单个列表(到位):

>>> a = [1,2,3,4]
>>> a[::-1]
[4, 3, 2, 1]

类似于:

all_reversed = [lst[::-1] for lst in figure]

...或...

all_reversed = map(lambda x: x[::-1], figure)

...会做你想做的事。

答案 2 :(得分:3)

reversed_lists = [list(reversed(x)) for x in figure]

答案 3 :(得分:1)

map(lambda row: list(reversed(row)), figure)

答案 4 :(得分:0)

你也可以简单地做

for row in figure:
    row.reverse()

更改每一行。