【问题标题】:How to cycle list in python? [duplicate]如何在python中循环列表? [复制]
【发布时间】:2018-11-19 20:45:55
【问题描述】:

假设我从下面的列表[a,b,c] 开始,并且我想从这个列表中创建下面的列表[[a,b,c], [c,a,b], [b,c,a]],它包含原始列表的所有循环。我怎样才能以最有效的方式做到这一点?

【问题讨论】:

  • 你试试看?
  • 我可以定义一个旋转列表的函数 `def rotate(l, n): return l[n:] + l[:n]` 但对我来说似乎应该有更多这样做的有效方法。
  • 您只是在寻找列表的排列吗?骑自行车通常指的是别的东西。

标签: python python-3.x


【解决方案1】:

list comprehension 或者你想要一些特别的东西?

lst = ['a','b','c']

n_lst = [lst[x:] + lst[:x] for x in range(len(lst))]
print(n_lst)

输出

[['a', 'b', 'c'], ['b', 'c', 'a'], ['c', 'a', 'b']]

对所有排列都有特殊意义

import itertools
list(itertools.permutations(lst))

输出

[
  ('a', 'b', 'c'), 
  ('a', 'c', 'b'), 
  ('b', 'a', 'c'), 
  ('b', 'c', 'a'), 
  ('c', 'a', 'b'), 
  ('c', 'b', 'a')
]

我还检查了list comprehension 的执行时间和来自@jpp 答案的collections.deque 对象的内置函数rotate 的执行时间。

lst = list(range(10000))

# list comprehension time
1.923051118850708

# rotate from collections.deque time
1.6390318870544434

rotate 更快

【讨论】:

    【解决方案2】:

    使用collections.deque及其方法rotate

    from collections import deque
    
    A = deque(['a', 'b', 'c'])
    
    res = []
    for i in range(len(A)):
        A.rotate()
        res.append(list(A))
    
    print(res)
    
    [['c', 'a', 'b'],
     ['b', 'c', 'a'],
     ['a', 'b', 'c']]
    

    【讨论】:

      猜你喜欢
      • 2022-06-13
      • 1970-01-01
      • 2012-01-08
      • 2012-05-26
      相关资源
      最近更新 更多