【问题标题】:list.reverse does not return list?list.reverse 不返回列表?
【发布时间】:2011-05-15 21:45:32
【问题描述】:

返回对象名为None,对应list.reverse()。所以当我调用solution(k) 时,这段代码失败了。有什么办法可以绕过做一个临时的吗?或者我应该怎么做?

fCamel = 'F'
bCamel = 'B'
gap = ' '

k = ['F', ' ', 'B', 'F']

def solution(formation):
    return ((formation.index(bCamel) > (len(formation) - 1 - (formation.reverse()).index(fCamel))))

附言这是我在 python 中的第一个代码。我认为它是功能性的。

【问题讨论】:

  • 如果您要查找的元素不在列表中会怎样?也许如果您描述您正在尝试做的事情,我们可以帮助您做出更好的更“pythonic”的解决方案。
  • 我正在尝试在 python 中解决骆驼难题,以便我可以学习一点语言。基本上,如果所有 'F' 都在第一个 'B' 的左侧,则此函数应返回 true。
  • 只是想知道。我看到越来越多的问题仍然没有得到支持。对我来说,这似乎是一个有趣的问题,如果是一个简单的问题。为什么人们不多为问题投票呢?我经常看到对答复的大量投票,这意味着该问题至少有可能带来有趣的解决方案或讨论,但问题本身却没有一票。对我来说似乎很奇怪(O_O)干杯!
  • @Morlock:我也经常想知道,我总是尝试对任何有趣的问题进行投票。
  • list.reverse 不返回列表。这是事实。你有什么问题?

标签: python functional-programming


【解决方案1】:

您可以使用reversed(formation) 返回formation 的反向迭代器。当您调用formation.reverse() 时,它会就地反转列表并返回无。

编辑:

我知道您现在正在尝试做什么,在我看来,使用列表理解更容易做到这一点:

def solution(formation):
    return len([k for k in formation[formation.index(bCamel)+1:] if k == fCamel]) == 0

这基本上是查看第一个bCamel 之后的所有元素,并收集所有具有fCamel 值的元素。如果该列表的长度 == 0,那么您就有了解决方案。

这里有几个例子:

>>> k = ['F','F','B','B','F']
>>> solution(k)
False
>>> k = ['F','F','B','B','B']
>>> solution(k)
True
>>> k = ['F','F','B','F','F','B','B']
>>> solution(k)
False
>>> 

【讨论】:

  • 这不适用于 OP 的未修改代码,因为“reversed”不返回列表,而是返回一个迭代器(它没有“index”方法)。
  • 是的,我记得并调整了我的评论。他肯定需要稍微修改他的代码才能让它按照他想要的方式工作。
  • 我明白这一点。但是,如果它返回反转的对象(这个?或者你在 python 中怎么称呼它?)也会更有意义,对吧?有没有其他功能可以做到这一点?否则我会有另外几行:(
  • 如果你一定要把它放在一行中,你可以使用list(reversed(formation))之类的东西。但是你很可能来自其他语言,你很快就会知道 Python 不赞成仅仅为了单行而创建一堆类似的方法:)
  • 我想他也可以只使用 (len(formation) - 1 - list[::-1].index(fCamel)) 但这也很丑。
【解决方案2】:

list.reverse 原地反转。那就是:

>>> l = [1, 2, 3]
>>> l.reverse()
>>> l
[3, 2, 1]

请咨询Python documentation,那里有类似的东西。您也可以尝试内置的“帮助”:

help(l.reverse) 内置函数 reverse 的帮助:

反向(...) L.reverse() -- 反向 IN PLACE

【讨论】:

    【解决方案3】:

    以 GWW 的回答为基础,如果您希望此代码按原样工作,您只需执行 list(reversed(formation))。如果您真的希望能够使用formation.reverse(),则必须继承list

    >>> class ReversableList(list):
    ...     def reverse(self):
    ...         return list(reversed(self))
    ... 
    >>> x = ReversableList([1,2,3])
    >>> x.reverse()
    [3, 2, 1]
    

    这是否可取当然是另一个问题。

    【讨论】:

      【解决方案4】:

      不是超级漂亮,但我在前面的答案中没有找到等价物。如果速度或内存成本很低(列表不是很长或操作没有重复很多次),这很简单,甚至更容易阅读。

      import copy
      
      fCamel = 'F'
      bCamel = 'B'
      gap = ' '
      
      k = ['F', ' ', 'B', 'F']
      
      def solution(formation):
          rev_formation = copy.copy(formation)
          rev_formation.reverse()
          return ((formation.index(bCamel) > (len(formation) - 1 -
                  (rev_formation).index(fCamel))))
      

      干杯

      【讨论】:

        【解决方案5】:

        您可以使用切片返回反向列表:

        l[::-1]
        

        【讨论】:

        • 如果放在最后会很棒 "l = [...] / print(l) / print(l[::-1] "
        • 这是这个问题的真正答案。它就地返回一个反向列表,因此您可以在列表推导中执行此操作。
        【解决方案6】:

        我刚遇到这个问题,想为来自 javascript 背景的新用户澄清一些事情。

        在 javascript 中,a.reverse() 会在原地反转并在调用时返回数组。

        Javascript:

        var a = [2, 3 ,4]
        console.log(a.reverse())
        // outputs [4, 3, 2]
        console.log(a)
        // outputs [4, 3, 2]
        

        在 python 中,a.reverse() 原地反转,但不返回数组。这让我感到困惑。

        在python中:

        a = [2, 3, 4]
        a.reverse()
        print(a)
        # outputs [4, 3, 2]
        # can't do print(a.reverse())
        

        【讨论】:

          【解决方案7】:

          这并没有提供 F _ B F 模式问题的解决方案,但它确实解决了使用 .reverse() 时 python 不返回列表的问题

          这就是我解决它的方法:

          chars = ['a', '-', 'c']
          chars2 = [] + chars
          chars2.reverse()
          totalChars = chars + chars2
          

          totalChars 返回 a-cc-a,这正是我想要的,并且 chars2 是一个列表,而不是指向 chars 的指针。希望这会有所帮助。

          【讨论】:

            【解决方案8】:

            以下更改将生效:

            NumSet={1,2,3,4,5,6,7,8,9,10}
            NumList = list(NumSet)
            NumList.reverse()
            print(NumList)
            
            • 避免在初始赋值后使用赋值运算符,因为列表是可变类型。

            • 在方法中使用 = 运算符..(例如 NumList = NumSet.reverse())将导致方法用空白覆盖列表,从而有效地清除列表。这就是 list 变成 NoneType 的原因。 方法是函数,实际上并没有自己的值,因此是空白。

            【讨论】:

              【解决方案9】:

              我不知道这是否适合你,但这适合我:

              list = [1,2,3]
              print([list, list.reverse()][0])
              

              list.reverse() 返回 None 的原因是该函数没有返回任何内容。

              使用您的代码:

              fCamel = 'F'
              bCamel = 'B'
              gap = ' '
              
              k = ['F', ' ', 'B', 'F']
              
              def solution(formation):
                  return ((formation.index(bCamel) > (len(formation) - 1 - ([formation, formation.reverse()][0]).index(fCamel))))
              
              print(solution(k))
              

              希望这对你有用!

              ps。老实说,我不知道为什么会这样。无意中发现的。

              【讨论】:

                【解决方案10】:

                标题问题已经回答,但你真正想要的是:

                基本上,如果所有'F'都在第一个'B'的左侧

                ,这个函数应该返回true

                这与没有'B'后跟'F'相同。检查这一点的好方法是使用迭代器:

                def solution(formation):
                    it = iter(formation)
                    return not (bCamel in it and fCamel in it)
                

                一些优点:

                • 与每个formation.index(...) 解决方案不同,如果搜索到的值不存在,它也不会崩溃。
                • 仅占用 O(1) 额外空间(与制作列表的反向副本的解决方案不同)。
                • 最多接触每个元素一次,并尽快停止。即使有 O(1) 时间的最佳情况(即使有数百万个元素,如果列表以 ['B', 'F', 开头,那么它就停在那里)。

                【讨论】:

                  猜你喜欢
                  • 2022-01-21
                  • 2015-06-02
                  • 2019-02-04
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-12-29
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多