我想做类似的事情,但是这段代码返回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)
如果某人有更好的解决方案我不知道请告诉我
亲切的问候,答案 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()
更改每一行。