【问题标题】:Get combinations of a list of number in a sequence获取序列中数字列表的组合
【发布时间】:2018-01-11 02:43:55
【问题描述】:

您好,我正在使用 python。我正在处理一个数字列表

A = [7,9,6,8]

我想获得按顺序排列的数字的排列。期望的输出如下:

[(6), (7), (8), (9), (6, 7), (7, 8), (8, 9), (6, 7, 8), (7, 8, 9)]

我的代码如下:

>>> import itertools
>>> A = [6,8,7,9]
>>> def comb(myc: list):
        retcol = []
        for i in range(1,len(myc)):
            retcol += list(itertools.combinations(myc,i))
        return retcol

>>> S = sorted(A, key=int)
>>> comb(S)
[(6,), (7,), (8,), (9,), (6, 7), (6, 8), (6, 9), (7, 8), (7, 9), (8, 9), (6, 7, 8), (6, 7, 9), (6, 8, 9), (7, 8, 9)]
>>> 

[(6,), (7,), (8,), (9,), (6, 7), (6, 8), (6, 9), (7, 8), (7, 9), (8, 9), (6, 7, 8), (6, 7, 9), (6, 8, 9), (7, 8, 9)]

我有两个问题:

  1. 我怎样才能只获得如上面所需输出中所示的序列中的组合。
  2. 有没有更好的方法来获得这样的结果而不需要明确的for loop?也许是list comprehension

【问题讨论】:

    标签: python


    【解决方案1】:

    怎么样

    l = sorted(A)
    [l[j : j + i] for i in range(1, len(l)) for j in range(len(l) - i + 1)]
    

    这会产生

    [[6], [7], [8], [9], [6, 7], [7, 8], [8, 9], [6, 7, 8], [7, 8, 9]]
    

    这不是您所要求的,但我猜您只是犯了错误(例如,让第一个元素是裸数字而不是单元素元组或单元素列表)。

    【讨论】:

    • 太棒了,我无法完全理解它是如何工作的,但如果 OP 想坚持使用元组,他也可以使用:sorted((tuple(A[i : j]) for i in range(len(A)) for j in range(len(A) + 1) if j > i), key = len)。但当然,单个元组仍将显示为 (x,)
    • @Kodiologist 问题中有一个错误对不起,A 不是列表而是集合。因此,您将输出作为元组本身。只是一个快速的问题,当我将集合转换为列表然后使用您的函数时,顺序是相反的,例如[7,6] [8,7,6] 等等。知道如何避免这种情况吗?
    • @iam.Carrot 首先尝试对A 进行排序。我已经进行了上面的编辑。
    • @iam.Carrot 不客气。我还想到了一个可以让你避开最外层的sorted 的调整,所以我做了那个。
    • @Kodiologist 是的,我想,但我不太确定这段代码是如何工作的。
    猜你喜欢
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    • 2016-08-26
    • 2019-05-28
    相关资源
    最近更新 更多