蟒蛇。在同一长度中合并两个列表

时间:2020-05-29 20:46:10

标签: python

问题是要使用两个相同长度的列表来构建扩展列表。 例如,有

qq=['a','b','c']
ww=['d','e','f']

my_function(qq,ww)

#I want to see output like:
output = [['a','b','c'],['a','b','f'],['a','e','c'],['a','e','f'],['d','e','f'],['d','e','c'],['d','b','f'],['d','b','c']]

制作具有相同长度列表并具有以下约束的所有组合:

  • 如果选择了a,则无法选择d, 相同的逻辑,
  • 如果选择了b,则不能选择e,
  • 如果选择c,则不能选择f。

重要的是元素在列表中的位置。

因此该函数采用两个相同长度的字符串列表。并返回组合列表。 我该怎么写?

2 个答案:

答案 0 :(得分:8)

您希望从2个列表中进行[a,d] * [b,e] * [c,f]对的乘积。使用zip进行配对,并使用product将它们全部组合在一起,整个过程就变得

  • 使用zip
  • ,每对只取一个元素,所以每个索引取一个元素
  • 使用product
  • 在两对之间构建所有组合
from itertools import product
def custom_product(valuesA, valuesB):
    return list(product(*zip(valuesA, valuesB))) # return list of tuple

def custom_product(valuesA, valuesB):
    return list(map(list, product(*zip(valuesA, valuesB)))) # return list of list

CODE DEMO

答案 1 :(得分:1)

这是一个递归解决方案。

当然,基本情况是每个列表只有一个项目,而我们将每个列表作为可能的输出。对于较长的列表,您会发现列表中所有可能的排列方式(不计算第一项),然后将这些项与每个第一项一起返回。


def solve(list1, list2):
     if len(list1) != len(list2):
         throw ValueError("Lists should be same length")
     if len(list1) == 0:
         return []
     if len(list1) == 1:
         return [[list1[0], list2[0]]
     children = solve(list1[1:], list2[1:])
     return [[list1[0]] + child for child in children] + [[list2[0]] + child for child in children]]

相关问题