获取 2 个列表的组合
Get the combination of 2 lists
我正在重新post这个问题,因为有人告诉我在上次 post 中有一个解决方案。
我有 2 个列表:
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_with_replacement
谢谢。
编辑
首先感谢@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)
这里的关键是使用旋转。 There are many ways to rotate an array,我将使用 deque
。
from collections import deque
list1 = ["foo", "bar", "lorem"]
list2 = ["X", "Y"]
list2new = [""] + list2
print(list2new) # ['', 'X', 'Y']
newList = [[list1[i]+list2new[j] for j in range(len(list2new))] for i in range(len(list1))]
print(newList)
# [['foo', 'fooX', 'fooY'], ['bar', 'barX', 'barY'], ['lorem', 'loremX', 'loremY']]
d = deque([0,0,0,1,1,1])
for it in range(2*len(list1)):
tmp = [newList[i][d[i]] for i in range(len(list1))]
print(tmp) #
d.rotate(1)
# ['foo', 'bar', 'lorem']
# ['fooX', 'bar', 'lorem']
# ['fooX', 'barX', 'lorem']
# ['fooX', 'barX', 'loremX']
# ['foo', 'barX', 'loremX']
# ['foo', 'bar', 'loremX']
在此之后,我们可以对 list2
中的其余值重复该过程。
for x in range(1,len(list2new)):
d = deque([0]*len(list1)+[x]*len(list1))
d.rotate(1)
for it in range(2*len(list1)-1): #
tmp = [newList[i][d[i]] for i in range(len(list1))]
print(tmp) #
d.rotate(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
for c in itertools.product([0,1],repeat=3):
tmp = [newList[i][c[i]] for i in range(len(c))]
print(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']
我在这里打印以在一行中显示列表,但您可以轻松修改它以将它们附加到另一个列表。
我正在重新post这个问题,因为有人告诉我在上次 post 中有一个解决方案。
我有 2 个列表:
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_with_replacement
谢谢。
编辑
首先感谢@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)
这里的关键是使用旋转。 There are many ways to rotate an array,我将使用 deque
。
from collections import deque
list1 = ["foo", "bar", "lorem"]
list2 = ["X", "Y"]
list2new = [""] + list2
print(list2new) # ['', 'X', 'Y']
newList = [[list1[i]+list2new[j] for j in range(len(list2new))] for i in range(len(list1))]
print(newList)
# [['foo', 'fooX', 'fooY'], ['bar', 'barX', 'barY'], ['lorem', 'loremX', 'loremY']]
d = deque([0,0,0,1,1,1])
for it in range(2*len(list1)):
tmp = [newList[i][d[i]] for i in range(len(list1))]
print(tmp) #
d.rotate(1)
# ['foo', 'bar', 'lorem']
# ['fooX', 'bar', 'lorem']
# ['fooX', 'barX', 'lorem']
# ['fooX', 'barX', 'loremX']
# ['foo', 'barX', 'loremX']
# ['foo', 'bar', 'loremX']
在此之后,我们可以对 list2
中的其余值重复该过程。
for x in range(1,len(list2new)):
d = deque([0]*len(list1)+[x]*len(list1))
d.rotate(1)
for it in range(2*len(list1)-1): #
tmp = [newList[i][d[i]] for i in range(len(list1))]
print(tmp) #
d.rotate(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
for c in itertools.product([0,1],repeat=3):
tmp = [newList[i][c[i]] for i in range(len(c))]
print(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']
我在这里打印以在一行中显示列表,但您可以轻松修改它以将它们附加到另一个列表。