【问题标题】:How do I get all combinations of a list with repeating values如何获得具有重复值的列表的所有组合
【发布时间】:2021-05-22 10:05:03
【问题描述】:

我有一个程序需要获取列表中所有可能的项目组合,但到目前为止我发现的并不能满足我的需要。从[1,2,3] 的列表中我需要输出,

(1)(2)(3)(1,1)(1,2)(1,3)(2,1)(2,2)(2,3)(3,1)(3,2)(3,3)

但是我找到的所有解决方案都给了我一个不重复值的答案,是否有一个库可以为我做到这一点,因为 itertools 没有给我正确的输出。否则我就自己做一个函数。

【问题讨论】:

  • 如果你想要(1)、(2)和(3),你可能也想要(1,2,3),对吧?
  • 是的,但我认为这些值的函数我也可以得到它
  • 在下面查看我的更新答案。

标签: python combinations permutation


【解决方案1】:

您最初想要的结果只是列表与自身的笛卡尔积:

my_list = [1,2,3]
list(itertools.product(my_list, my_list))
#=> [(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]

但您对其进行了编辑以包含 (1,)、(2,) 和 (3,)。在这种情况下,您可能会要求使用幂集 - 这是原始所有子集的集合。您可以使用this question 的答案,但请注意,结果将包括整个空列表和原始列表。

【讨论】:

    【解决方案2】:

    您可以通过列表理解来做到这一点:

    a = [1,2,3]
    [(i,j) for i in a for j in a]
    

    【讨论】:

      【解决方案3】:

      您可以使用递归生成器函数:

      def combos(d, l, c = []):
        yield tuple(c)
        if len(c) < l:
           yield from [i for b in d for i in combos(d, l, c+[b])]
      
      _, *vals = combos([1,2,3], 2)
      

      输出:

      [(1,), (1, 1), (1, 2), (1, 3), (2,), (2, 1), (2, 2), (2, 3), (3,), (3, 1), (3, 2), (3, 3)]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-14
        • 2021-05-10
        • 1970-01-01
        • 2022-11-19
        • 1970-01-01
        相关资源
        最近更新 更多