我想以特定方式和特定顺序生成子列表。
算法思路如下:
- 外层循环:移除最后一项
- 内循环:移除第一项
这是一个以 [A, B, C ,D]
列表开头的示例:
[A, B, C, D]
[B, C, D] (remove first item)
[C, D] (remove first item)
[A, B, D] (remove before last item)
[B, D] (remove first item)
[A, D] (remove before last item)
[D] (remove before last item)
我唯一的限制是,仅包含最后一项的长度为 1 的子列表必须是最后生成的子列表。
我以简单的迭代方式实现这个算法没有任何困难。但我更愿意以更 pythonic 的方式来做,比如列表理解或 itertools lib。
有什么建议吗?
最佳答案
可以通过双重嵌套理解+一些索引数学来完成:
>>> data = ['A', 'B', 'C', 'D']
>>>
>>> [data[i:j-1]+[data[-1]] for j in range(len(data),0,-1) for i in range(0, j-1)] + [data[-1]]
[['A', 'B', 'C', 'D'], ['B', 'C', 'D'], ['C', 'D'], ['A', 'B', 'D'], ['B', 'D'], ['A', 'D'], ['D']]
最后一个元素是一个特例,因为其组合前面的子列表是空的,即列表切片的长度按以下方式减少:
3 2 1
2 1
1
0
关于Python 以特定顺序生成子列表 - itertools?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56113576/