【问题标题】:Python sequences sublist generation in specific order - itertools?Python以特定顺序生成子列表 - itertools?
【发布时间】:2019-05-13 13:38:11
【问题描述】:

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

算法的思路如下:

  • 外循环:删除最后一项之前
  • 内循环:删除第一项

这是一个以[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 的子列表必须是最后生成的子列表。

我没有任何困难以天真的迭代方式实现这个算法。但我强烈希望以更 Python 的方式来做,比如使用列表推导或 itertools 库。

有什么建议吗?

【问题讨论】:

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


    【解决方案1】:

    可以通过双重嵌套理解 + 一些索引数学来完成:

    >>> 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 1970-01-01
      • 2015-04-11
      • 1970-01-01
      • 2021-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多