Python 以特定顺序生成子列表 - itertools?

标签 python python-3.x algorithm list python-itertools

我想以特定方式和特定顺序生成子列表。

算法思路如下:

  • 外层循环:移除最后一项
  • 内循环:移除第一项

这是一个以 [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/

相关文章:

python - python 在 float 前插入逗号

python-3.x - 通过 JDBC 进行并行化 - Pyspark - 如何使用 JDBC 进行并行化?

arrays - 如何在 O(nlogn) 和 O(n) 内查找数组中所有 "feasible"值?

database - 我可以使用优雅的配对功能作为数据库中的主键吗?

python-3.x - 我想计算数据帧中列中重复值的出现次数并更新 python 中新列中的计数

python - 如何将 Python bool 对象转换为 C int(或 C++ bool 值)(Python C API)

python - 如何在wxpython中传递字符'素数?

python - 根据其属性为python对象生成唯一ID

algorithm - Bresenham Integer Equation(不仅仅是算法)

python - Pycharm 警告 : must implement all abstract methods