Python 3.x 获取两个列表的组合

Python 3.x 获取两个列表的组合,python-3.x,list,permute,Python 3.x,List,Permute,我重新发布这个问题是因为我在上一篇文章中被告知有一个解决方案 我有两份清单: list1 = ["foo", "bar", "lorem"] list2 = ["X", "Y"] 我想要这两个列表中的可能组合,意思是: [["foo", "bar", "lorem"], ["foo", "bar", "loremX"], ["foo", "barX", "loremX"], ["fooX", "bar", "loremX"], ["fooX", "barX", "loremX"],

我重新发布这个问题是因为我在上一篇文章中被告知有一个解决方案

我有两份清单:

list1 = ["foo", "bar", "lorem"]
list2 = ["X", "Y"]
我想要这两个列表中的可能组合,意思是:

[["foo", "bar", "lorem"],
 ["foo", "bar", "loremX"],
 ["foo", "barX", "loremX"],
 ["fooX", "bar", "loremX"],
 ["fooX", "barX", "loremX"],
 ["foo", "barX", "lorem"],
 ["fooX", "barX", "lorem"],
 ["fooX", "bar", "lorem"],

 ["foo", "bar", "lorem"],
 ["foo", "bar", "loremY"],
 ["foo", "barY", "loremY"],
 ["fooY", "bar", "loremY"],
 ["fooY", "barY", "loremY"],
 ["foo", "barY", "lorem"],
 ["fooY", "barY", "lorem"],
 ["fooY", "bar", "lorem"]]
希望我没有错过任何组合

有点迷路了

它可能应该与itertools.combinations_和替换一起使用

谢谢

编辑

首先,感谢@titusarmah99提供了一个很好的答案。 我设法采用了他的第二个非常简单的解决方案,并使其通用化:

import itertools

list1 = ["foo", "bar", "lorem"]
list2 = ["X", "Y"]
list2new = [""] + list2
newList = [[list1[i]+list2new[j] for j in range(len(list2new))] for i in range(len(list1))]

for index in range(1, len(list2) + 1):
    for c in itertools.product([0,index],repeat=len(list1)):
        tmp = [newList[i][c[i]] for i in range(len(c))]
        print(tmp)


这里的关键是使用旋转,我将使用
deque

从集合导入数据
列表1=[“foo”、“bar”、“lorem”]
列表2=[“X”,“Y”]
list2new=[“”]+list2
打印(列表2新)#['''X','Y']
newList=[[list1[i]+list2new[j]表示范围内的j(len(list2new))]表示范围内的i(len(list1))]
打印(新列表)
#[['foo','fooX','fooY'],['bar','barX','barY'],['lorem','loremX','loremY']
d=deque([0,0,0,1,1,1])
对于范围(2*len(列表1))内的it:
tmp=[newList[i][d[i]]表示范围内的i(len(list1))]
打印(tmp)#
d、 旋转(1)
#['foo','bar','lorem']
#['fooX','bar','lorem']
#['fooX','barX','lorem']
#['fooX','barX','loremX']
#['foo','barX','loremX']
#['foo','bar','loremX']
在此之后,我们可以对
list2
中的其余值重复此过程

范围内x的
(1,len(list2new)):
d=deque([0]*len(列表1)+[x]*len(列表1))
d、 旋转(1)
对于范围(2*len(列表1)-1)内的it:#
tmp=[newList[i][d[i]]表示范围内的i(len(list1))]
打印(tmp)#
d、 旋转(1)
#['fooX','bar','lorem']
#['fooX','barX','lorem']
#['fooX','barX','loremX']
#['foo','barX','loremX']
#['foo','bar','loremX']
#['fooY','bar','lorem']
#['fooY','barY','lorem']
#['fooY','barY','loremY']
#['foo','barY','loremY']
#['foo','bar','loremY']
这将不包含
['foo','bar','lorem']
,因此手动添加它

编辑:好像你编辑了这个问题。要获得所有可能的组合,只需使用
newList
itertools.product

对于itertools.product([0,1],重复=3)中的c:
tmp=[newList[i][c[i]]表示范围内的i(len(c))]
打印(tmp)#

这里的关键是使用旋转,我将使用
deque

从集合导入数据
列表1=[“foo”、“bar”、“lorem”]
列表2=[“X”,“Y”]
list2new=[“”]+list2
打印(列表2新)#['''X','Y']
newList=[[list1[i]+list2new[j]表示范围内的j(len(list2new))]表示范围内的i(len(list1))]
打印(新列表)
#[['foo','fooX','fooY'],['bar','barX','barY'],['lorem','loremX','loremY']
d=deque([0,0,0,1,1,1])
对于范围(2*len(列表1))内的it:
tmp=[newList[i][d[i]]表示范围内的i(len(list1))]
打印(tmp)#
d、 旋转(1)
#['foo','bar','lorem']
#['fooX','bar','lorem']
#['fooX','barX','lorem']
#['fooX','barX','loremX']
#['foo','barX','loremX']
#['foo','bar','loremX']
在此之后,我们可以对
list2
中的其余值重复此过程

范围内x的
(1,len(list2new)):
d=deque([0]*len(列表1)+[x]*len(列表1))
d、 旋转(1)
对于范围(2*len(列表1)-1)内的it:#
tmp=[newList[i][d[i]]表示范围内的i(len(list1))]
打印(tmp)#
d、 旋转(1)
#['fooX','bar','lorem']
#['fooX','barX','lorem']
#['fooX','barX','loremX']
#['foo','barX','loremX']
#['foo','bar','loremX']
#['fooY','bar','lorem']
#['fooY','barY','lorem']
#['fooY','barY','loremY']
#['foo','barY','loremY']
#['foo','bar','loremY']
这将不包含
['foo','bar','lorem']
,因此手动添加它

编辑:好像你编辑了这个问题。要获得所有可能的组合,只需使用
newList
itertools.product

对于itertools.product([0,1],重复=3)中的c:
tmp=[newList[i][c[i]]表示范围内的i(len(c))]
打印(tmp)#

list2
中的每个字符串与空字符串组合,然后用
list1
压缩结果并连接字符串

from itertools import product

for item in list2:
    for suffixes in product(['', item], repeat=3):
        print([x + s for x, s in zip(list1, suffixes)])
输出:

['foo', 'bar', 'lorem']
['foo', 'bar', 'loremX']
['foo', 'barX', 'lorem']
['foo', 'barX', 'loremX']
['fooX', 'bar', 'lorem']
['fooX', 'bar', 'loremX']
['fooX', 'barX', 'lorem']
['fooX', 'barX', 'loremX']
['foo', 'bar', 'lorem']
['foo', 'bar', 'loremY']
['foo', 'barY', 'lorem']
['foo', 'barY', 'loremY']
['fooY', 'bar', 'lorem']
['fooY', 'bar', 'loremY']
['fooY', 'barY', 'lorem']
['fooY', 'barY', 'loremY']

在这里,我打印的目的是在每行上显示列表,但您可以轻松地修改它以将它们附加到另一个列表。

list2
中的每个字符串与空字符串组合起来,然后将结果与
list1
压缩并连接字符串

from itertools import product

for item in list2:
    for suffixes in product(['', item], repeat=3):
        print([x + s for x, s in zip(list1, suffixes)])
输出:

['foo', 'bar', 'lorem']
['foo', 'bar', 'loremX']
['foo', 'barX', 'lorem']
['foo', 'barX', 'loremX']
['fooX', 'bar', 'lorem']
['fooX', 'bar', 'loremX']
['fooX', 'barX', 'lorem']
['fooX', 'barX', 'loremX']
['foo', 'bar', 'lorem']
['foo', 'bar', 'loremY']
['foo', 'barY', 'lorem']
['foo', 'barY', 'loremY']
['fooY', 'bar', 'lorem']
['fooY', 'bar', 'loremY']
['fooY', 'barY', 'lorem']
['fooY', 'barY', 'loremY']

在这里,我打印的是在每行上显示列表,但是您可以很容易地修改它以将它们附加到另一个列表。

我认为,您显示的最终结果与所有可能组合的定义不太匹配。你能解释一下你想找到什么吗?@titusarmah99你说得对,我刚刚注意到了。我想找到list1+中的所有值的组合,list2中的值,而不是list2+中的值。那么像
['fooX',bar',loremX']
['fooX',barX',loremY']
['fooX',barY',lorem']
@titusarmah99这样的组合呢?如果你有一个没有它们的解决方案,那就太好了。否则,我将能够处理它们。我认为,您显示的最终结果与所有可能组合的定义不太匹配。你能解释一下你想找到什么吗?@titusarmah99你说得对,我刚刚注意到了。我想找到list1+中的所有值的组合,list2中的值,而不是list2+中的值。那么像
['fooX',bar',loremX']
['fooX',barX',loremY']
['fooX',barY',lorem']
@titusarmah99这样的组合呢?如果你有一个没有它们的解决方案,那就太好了。否则,我将能够处理它们。是的,我想添加我错过的其余组合。现在就测试您的解决方案,到目前为止看起来很棒!你给出的第一个解决方案很神奇!第二个只给出了第一部分(仅用于“X”)。我想我会选择第一个。非常感谢你!第二部分也为“Y”工作