【问题标题】:why i can't reverse a list of list in python为什么我不能在 python 中反转列表列表
【发布时间】:2010-09-25 16:05:23
【问题描述】:

我想做这样的事情,但是这段代码返回 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)

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

亲切的问候,

【问题讨论】:

标签: python list reverse map-function


【解决方案1】:

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

构建一个列表通常比构建一个迭代器更昂贵,因为在绝大多数情况下,您只想对结果进行循环;因此,诸如 reversed 之类的内置函数(以及 itertools 模块中的所有精彩构建块)返回迭代器,不是列表。

但是,如果您因此有一个迭代器 x 但确实需要等效的 list 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 一样熟练的人来维护——使用最简单的“来自第一原理的代码”方法是一个合理的立场,除非分析告诉你踩下踏板. (我个人认为“火星笑脸”非常重要,可以避免将这种良好的一般哲学应用于这个特定的用例,但是,嘿,理性的人可能会在这个非常具体的点上有所不同!-)。

【讨论】:

    【解决方案2】:

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

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

    ...会做你想做的事。

    【讨论】:

      【解决方案3】:
      reversed_lists = [list(reversed(x)) for x in figure]
      

      【讨论】:

        【解决方案4】:
        map(lambda row: list(reversed(row)), figure)
        

        【讨论】:

          【解决方案5】:

          你也可以这样做

          for row in figure:
              row.reverse()
          

          原地改变每一行。

          【讨论】:

            猜你喜欢
            • 2023-04-03
            • 1970-01-01
            • 2021-09-30
            • 2011-08-22
            • 1970-01-01
            • 1970-01-01
            • 2019-11-14
            • 2011-11-07
            相关资源
            最近更新 更多