【问题标题】:Python: How to return a list without modifying the original list using a while loop only?Python:如何在不修改原始列表的情况下仅使用 while 循环返回列表?
【发布时间】:2013-06-12 08:02:29
【问题描述】:

假设我有一个名为 everythird 的函数,它接受一个列表作为其参数,并返回一个新列表,其中包含原始列表的每个第三个元素,从索引 0 开始。 我知道如何使用切片表示法(返回 everythird[0::3])来做到这一点,但我们只能使用 while 循环。如果我输入 everythird([1, 2, 3, 4, 5, 6, 7, 8]),我希望它返回 [1, 4, 7]。我尝试了几种不同的方法,但我没有得到一个列表,或者我只得到一个值。如何返回列表?另外,您如何确定某些内容是否修改了原始列表?

谢谢。

这是我尝试的方法之一: every_third([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])

def everythird(l):
    '''(list) -> list
    Returns every third element of original list, starting at index 0'''

    i = 0
    while i < len(l):
        print(l[i])
        i += 3

这会打印出来

1
4
7

【问题讨论】:

  • 你根本没有任何return 声明。
  • 只是yield l[i] 而不是print;调用者函数可以使用list()获取列表
  • @mshsayem:这将返回一个迭代器,而不是一个列表。这是一个很好的方法,但我不确定这是 OP 想要的。

标签: python list python-3.x while-loop


【解决方案1】:

如果您需要使用 while 循环来执行此操作,您可以通过将每个元素附加到列表而不是打印它来完成,然后返回该列表:

def everythird(l):
    i = 0
    ret = []
    while i < len(l):
        ret.append(l[i])
        i += 3
    return ret

虽然你注意到了,但最好这样做

def everythird(l):
    return l[0::3]

或者,如果您被允许使用 for 循环:

def everythird(l):
    ret = []
    for i in range(0, len(l), 3):
        ret.append(l[i])
    return ret

最后,如果你被允许使用列表推导:

def everythird(l):
    return [l[i] for i in range(0, len(l), 3)]

切片索引当然是最好的,但无论如何,while 循环可能是最糟糕的方法。

【讨论】:

  • 感谢大卫的帮助!不过有一件事,我注意到您有使用 while 循环的解决方案的 append 方法。如果不使用方法而仅使用 while 循环,您将如何获得相同的结果?那可能吗?再次感谢
  • @user2489861:这是一个奇怪的要求。我想如果你必须避免使用某种方法,你可以改用ret += [l[i]],尽管这只是隐含地使用extend 方法。但是你确定要生成一个列表而不是迭代器(比如可以迭代一次的列表?)如果你想创建一个迭代器,你可以在每次迭代中执行yield l[i]
  • 是的,这正是我想知道的!这绝对不是最有效的方法,但我想知道如何仅使用 while 循环来做到这一点。非常感谢!!
猜你喜欢
  • 2021-05-13
  • 1970-01-01
  • 2017-07-20
  • 2022-11-03
  • 2020-09-13
  • 1970-01-01
  • 2021-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多