【问题标题】:Combinations of two lists in Python while preserving "column" orderPython中两个列表的组合,同时保留“列”顺序
【发布时间】:2020-07-12 22:18:12
【问题描述】:

我有一个 Python 中的原始列表,如下所示:

list = [a, 1, b, 2, c, 3]

我已将其分为两个列表,如下所示:

list_1 = [a, b, c]
list_2 = [1, 2, 3]

我想要找到的是列表的最终列表,它为我提供了 list_1list_2 的所有可能组合 不更改其当前“列”中的任何字母或数字。所以输出应该是这样的:

期望的输出:

final_list =[[a, b, c],
             [a, 2, c],
             [a, b, 3],
             [a, 2, 3],
             [1, b, c],
             [1, 2, c],
             [1, b, 3],
             [1, 2, 3]]

有什么想法可以实现这一点吗?

【问题讨论】:

  • 您创建所需输出的逻辑是什么?
  • 每个“列”代表一个变量。假设第一个“列”的变量可以具有a1 的值。第二列的变量的值可以是“b”或“2”等。我想要的是在输出上给出这些变量的所有可能组合(即“列”),第一列只能有a1;第二个b2 等。如果字母c 或数字3 出现在第一个“列”中不会发生什么,因为这意味着第一个“列”中表示的变量将具有一个值属于另一个变量。

标签: python combinations permutation itertools


【解决方案1】:

这是一种蛮力递归方法:

def get_combinations(curr_list, list1, list2, index, overall_list):
    if index == len(list1) or index == len(list2):
        overall_list.append(curr_list[:])
        return

    curr_list[index] = list1[index]
    get_combinations(curr_list, list1, list2, index+1, overall_list)
    curr_list[index] = list2[index]
    get_combinations(curr_list, list1, list2, index+1, overall_list)


list1 = list(input().strip().split())
list2 = list(input().strip().split())
overall_list = []
curr_list = [None] * min(len(list1), len(list2))
get_combinations(curr_list, list1, list2, 0, overall_list)
for l in overall_list:
    print(*l)

输入:

a b c
1 2 3

输出:

a b c
a b 3
a 2 c
a 2 3
1 b c
1 b 3
1 2 c
1 2 3

【讨论】:

  • 这非常适合打印结果。但是我怎么能修改它来给我一个包含所有解决方案的列表而不是在屏幕上打印呢?我尝试在函数之前创建一个列表并附加到它而不是做print(curr_list),但这不起作用。随着循环的进行,这些值会被最终的值替换
  • 非常感谢。完美运行。希望有一天我能完全理解自己应用它的逻辑。
【解决方案2】:

我认为这样看你的问题会更容易:

list = [a, 1, b, 2, c, 3]

制作三个列表,一个是第一个数字可以取的值,一个是第二个,一个是第三个:

first = [a,1]
second = [b,2]
third = [c,3]

要生成每个组合,您可以组合三个迭代三个列表元素的 for 循环。在哪个 for 循环中使用哪个列表会更改生成组合的顺序。我让我的例子与你的输出相匹配:

for f in first:
    for t in third:
        for s in second:
            //Here you have a [f,s,t] combination

【讨论】:

  • 这可能是一个更好的看待它的方式。问题是我可以有任意数量的变量(“列”),所以我怎么知道我需要提前循环遍历所有变量的 for 循环数?
  • 嗯,我可以看到解决方案,但它涉及更多。我将创建一个递归方法,该方法采用“列”列表和已选择作为参数的值的“前缀”。如果另一个不完全满意,我可以尝试为你写下来,虽然我不熟悉 Python 语法:P
猜你喜欢
  • 1970-01-01
  • 2013-02-28
  • 1970-01-01
  • 2014-06-03
  • 2021-01-29
  • 2020-06-15
  • 2015-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多