【问题标题】:Reverse a list in python using append and pop method [duplicate]使用追加和弹出方法在python中反转列表[重复]
【发布时间】:2021-09-20 23:10:51
【问题描述】:

在教程视频中,我看到 for 循环中使用的范围是“range(len(l))”,它成功地反转了列表。

但我想简单地加上“ l ”就可以解决问题,但没有人可以告诉我这是为什么?

def reversed_list(l):
    rev = []
    for i in l:
        l_popped = l.pop()
        rev.append(l_popped)
    return rev
SAMPLE_LIST = [1,2,3,4]     

print(reversed_list(SAMPLE_LIST))

OUTPUT:
[4, 3]

【问题讨论】:

  • 因为您在循环列表时更改了列表(使用l.pop())。因此,当您遍历列表时,您的列表会缩短。
  • 不要更改您正在迭代的列表。对于反转,您可以使用return list(reverse(l)) 函数或切片return l[::-1]

标签: python list reversing


【解决方案1】:

我不确定您观看的教程做了什么,但range(len(_)) 不会反转,它只会创建一个与列表大小相同的range,从 0 开始。

如果你想在 Python 中反转一个列表,只需使用内置的reversed

l = list("hello")
print(list(reversed(l)))  # at list to have an actual list as opposed to an iterator
# ['o', 'l', 'l', 'e', 'h']
print(range(len(l)))
# range(0, 5)

PS:您的解决方案不起作用的原因是您正在使用pop 更改您在迭代期间迭代的对象。一个简单的调试方法是添加一个打印语句:

def reversed_list(l):
    rev = []
    for i in l:
        print("This is l:", l)
        l_popped = l.pop()
        rev.append(l_popped)
    return rev

print(reversed_list([1,2,3,4]))
# This is l: [1, 2, 3, 4]
# This is l: [1, 2, 3]
# [4, 3]

【讨论】:

    【解决方案2】:

    这个循环是问题的根本原因。

    for i in l:
            l_popped = l.pop()
            rev.append(l_popped)
        return rev
    

    让我们尝试试运行。
    当 i = 1(索引 0)时,弹出 4 并且 rev = [4], l = [1, 2, 3]
    当 i = 2(索引 1)时,它会弹出 3 并且 rev = [4, 3], l = [1, 2]
    现在,索引跨越了 l 的长度,因此不会执行对剩余元素的操作。

    【讨论】:

      【解决方案3】:

      如果你真的想使用pop 来反转一个列表,你可以做一个原始列表的浅拷贝。每次迭代,列表的长度都会减少

      >>> x=[1,2,3,4]
      >>> z=x.copy()
      >>> y=[x.pop(i) for i in range(len(z)-1,-1,-1)]
      >>> y
      [4, 3, 2, 1]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-23
        • 1970-01-01
        • 1970-01-01
        • 2019-04-06
        • 2020-08-08
        • 2023-03-11
        • 1970-01-01
        相关资源
        最近更新 更多