【问题标题】:Python while and for loops - can I make the code more efficient?Python while 和 for 循环 - 我可以让代码更高效吗?
【发布时间】:2013-12-03 11:37:49
【问题描述】:

我写了以下代码:

initial_list = [item1, item2, item3, item4, ...]
lists = [[list1], [list2], [list3], [list4], ..., [list(n-1)], [list(n)]]
# The number of elements in the both lists might chance

while len(initial_list) > 0:
    for list in lists:
        if len(initial_list) == 0:
            break
        item = initial_list.pop(0)
        list.append(item)

我想知道是否有更好/更简单/更短的方法来编写上面的代码?如果是,请不要使用困难的功能(等),因为我还是初学者,不会理解。

【问题讨论】:

  • 您是否尝试将初始列表中的每个项目添加到lists 列表中的每个嵌套列表中?
  • 看起来initial_list 可以比lists 有更多或更少的元素。
  • 是的。像这样:初始列表中的第一项进入第一个嵌套列表,第二个进入第二个嵌套列表,...,初始列表中的第 N 个项目进入最后一个(即第 N 个)嵌套列表,然后第 (N + 1) 个项目再次进入第一个嵌套列表等。当初始列表中不再有任何元素时它停止。

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


【解决方案1】:

我相信您正在尝试将 initial_list 中的项目附加到 lists 中的嵌套列表值,直到使用所有值 initial_list,如果嵌套列表少于初始值,则从一开始就循环 lists追加。

使用zip() 将嵌套列表与initial_list 项目配对:

from itertools import cycle

for nested, value in zip(cycle(lists), initial_list):
    nested.append(value)

这里的itertools.cycle() function 确保使用来自initial_list 的所有值; zip() 停在 最短 列表中,此处始终为 initial_lists

带有 10 个值(整数 09)的初始列表和一个包含 4 个空子列表的嵌套列表的演示:

>>> from itertools import cycle
>>> initial_list = range(10)
>>> lists = [[] for _ in range(4)]
>>> for nested, value in zip(cycle(lists), initial_list):
...     nested.append(value)
... 
>>> lists
[[0, 4, 8], [1, 5, 9], [2, 6], [3, 7]]

不使用循环将需要您保留一个计数器并附加到lists[count % len(lists)]。计数器可以用enumerate()函数生成:

for i, value in enumerate(initial_list):
    lists[i % len(lists)].append(value)

【讨论】:

  • 谢谢!但是有什么方法可以使用基本的东西(条件,迭代(for,while)等)并使上面的代码更好,因为你的代码对我来说有点太高级了。
  • 您要求高效的代码,这是(非常)高效的代码。它避免了弹出initial_list(缩小列表会花费你)。我不能这么容易地将它重新转换为基本的东西。我这里用的都是标准库,zip()是内置函数。
  • 我给了你一个替代版本,一个使用计数器的版本。
  • 好的,谢谢!我会调查你的代码,尤其是第 3 行和第 4 行,因为我不太了解这些(我是一个完全的初学者,在不了解基础知识之前我不想跳到新的和更难的地方)。跨度>
  • 也感谢您提供替代版本!
【解决方案2】:

你可以使用:

if container:

...而不是:

if len(container) > 0:

另外,list_.pop(0) 很慢。也许您正在寻找 http://docs.python.org/3/library/collections.html#collections.deque ?它可以让您快速从任一端移除东西,但您将无法再方便地访问 (EG) 中间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 2018-05-25
    • 2021-12-28
    • 2019-08-08
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    相关资源
    最近更新 更多