从 2 个列表生成所有交换集
Generate set of all swap from 2 lists
我使用 pyhton 并想创建类似于一组列表的东西。我解释。
作为输入,我有一个这样的列表:
s = [[0,4,5,6,8],[1,2,3]]
我想在所有 s[0] 和 s[1] 元素之间对这个 s 应用随机交换。问题是我想列举(不是明确地)这种交换的所有可能结果。我尝试了一些 itertools 东西但没有成功。
换句话说,预期的输出是一个包含 s 的所有可能交换的可迭代对象。
欢迎任何建议!
s = [[0,4,5,6,8],[1,2,3]]
def swap(s):
i0 = randint(0,len(s[0])-1)
i1 = randint(0,len(s[1])-1)
s[0][i0],s[1][i1] = s[1][i1],s[0][i0]
编辑:我觉得我没把问题解释好。
如果我们有输入:
s = [[0,4,5,6,8],[1,2,3]]
输出类似于:
S = [[[1,4,5,6,8],[0,2,3]],
[[0,1,5,6,8],[4,2,3]],
[[0,4,1,6,8],[5,2,3]],
[[0,4,5,1,8],[6,2,3]],
[[0,4,5,6,1],[8,2,3]],
[[2,4,5,6,8],[1,0,3]],
...
对于 S 中的每个元素 e,e 必须与 s 仅相差 2 个元素的一个排列
不确定我是否答对了你的问题,但你可以使用 itertools.combinations 生成所有可能的交换。
from itertools import combinations
listIn = [[0,4,5,6,8],[1,2,3]]
shortList, longList = sorted(listIn, key=len)
result = []
for longPart in combinations(longList,len(longList)-1):
for shortPart in combinations(shortList,len(shortList)-2):
longPart = list(longPart)
shortPart = list(shortPart)
p1 = longPart + shortPart
p2 = list(set(longList) - set(longPart)) + list(set(shortList) - set(shortPart))
result.append([p1, p2])
对于您的示例,结果列表包含所有 15 个可能 single-swaps。
此处摘录:
[[0, 4, 5, 6, 1], [8, 2, 3]]
[[0, 4, 5, 6, 2], [8, 1, 3]]
[[0, 4, 5, 6, 3], [8, 1, 2]]
[[0, 4, 5, 8, 1], [6, 2, 3]]
[[0, 4, 5, 8, 2], [6, 1, 3]]
[[0, 4, 5, 8, 3], [6, 1, 2]]
[[0, 4, 6, 8, 1], [5, 2, 3]]
[[0, 4, 6, 8, 2], [5, 1, 3]]
[[0, 4, 6, 8, 3], [5, 1, 2]]
[[0, 5, 6, 8, 1], [4, 2, 3]]
[[0, 5, 6, 8, 2], [4, 1, 3]]
[[0, 5, 6, 8, 3], [4, 1, 2]]
[[4, 5, 6, 8, 1], [0, 2, 3]]
[[4, 5, 6, 8, 2], [0, 1, 3]]
[[4, 5, 6, 8, 3], [0, 1, 2]]
也许我误解了这个问题,但如果您希望所有组合都将列表 1 的元素与列表 2 的元素交换,这里有另一种方法。
我们创建嵌套列表的副本并排列这两个列表中的元素。
s = [[0, 4, 5, 6, 8], [1, 2, 3]]
output = []
for i in range(len(s[0])):
for j in range(len(s[1])):
temp_s = [s[0].copy(), s[1].copy()]
temp_s[0][i], temp_s[1][j] = temp_s[1][j], temp_s[0][i]
output.append(temp_s)
输出:
[[[1, 4, 5, 6, 8], [0, 2, 3]],
[[2, 4, 5, 6, 8], [1, 0, 3]],
[[3, 4, 5, 6, 8], [1, 2, 0]],
[[0, 1, 5, 6, 8], [4, 2, 3]],
[[0, 2, 5, 6, 8], [1, 4, 3]],
[[0, 3, 5, 6, 8], [1, 2, 4]],
[[0, 4, 1, 6, 8], [5, 2, 3]],
[[0, 4, 2, 6, 8], [1, 5, 3]],
[[0, 4, 3, 6, 8], [1, 2, 5]],
[[0, 4, 5, 1, 8], [6, 2, 3]],
[[0, 4, 5, 2, 8], [1, 6, 3]],
[[0, 4, 5, 3, 8], [1, 2, 6]],
[[0, 4, 5, 6, 1], [8, 2, 3]],
[[0, 4, 5, 6, 2], [1, 8, 3]],
[[0, 4, 5, 6, 3], [1, 2, 8]]]
我使用 pyhton 并想创建类似于一组列表的东西。我解释。 作为输入,我有一个这样的列表:
s = [[0,4,5,6,8],[1,2,3]]
我想在所有 s[0] 和 s[1] 元素之间对这个 s 应用随机交换。问题是我想列举(不是明确地)这种交换的所有可能结果。我尝试了一些 itertools 东西但没有成功。 换句话说,预期的输出是一个包含 s 的所有可能交换的可迭代对象。 欢迎任何建议!
s = [[0,4,5,6,8],[1,2,3]]
def swap(s):
i0 = randint(0,len(s[0])-1)
i1 = randint(0,len(s[1])-1)
s[0][i0],s[1][i1] = s[1][i1],s[0][i0]
编辑:我觉得我没把问题解释好。 如果我们有输入:
s = [[0,4,5,6,8],[1,2,3]]
输出类似于:
S = [[[1,4,5,6,8],[0,2,3]],
[[0,1,5,6,8],[4,2,3]],
[[0,4,1,6,8],[5,2,3]],
[[0,4,5,1,8],[6,2,3]],
[[0,4,5,6,1],[8,2,3]],
[[2,4,5,6,8],[1,0,3]],
...
对于 S 中的每个元素 e,e 必须与 s 仅相差 2 个元素的一个排列
不确定我是否答对了你的问题,但你可以使用 itertools.combinations 生成所有可能的交换。
from itertools import combinations
listIn = [[0,4,5,6,8],[1,2,3]]
shortList, longList = sorted(listIn, key=len)
result = []
for longPart in combinations(longList,len(longList)-1):
for shortPart in combinations(shortList,len(shortList)-2):
longPart = list(longPart)
shortPart = list(shortPart)
p1 = longPart + shortPart
p2 = list(set(longList) - set(longPart)) + list(set(shortList) - set(shortPart))
result.append([p1, p2])
对于您的示例,结果列表包含所有 15 个可能 single-swaps。
此处摘录:
[[0, 4, 5, 6, 1], [8, 2, 3]]
[[0, 4, 5, 6, 2], [8, 1, 3]]
[[0, 4, 5, 6, 3], [8, 1, 2]]
[[0, 4, 5, 8, 1], [6, 2, 3]]
[[0, 4, 5, 8, 2], [6, 1, 3]]
[[0, 4, 5, 8, 3], [6, 1, 2]]
[[0, 4, 6, 8, 1], [5, 2, 3]]
[[0, 4, 6, 8, 2], [5, 1, 3]]
[[0, 4, 6, 8, 3], [5, 1, 2]]
[[0, 5, 6, 8, 1], [4, 2, 3]]
[[0, 5, 6, 8, 2], [4, 1, 3]]
[[0, 5, 6, 8, 3], [4, 1, 2]]
[[4, 5, 6, 8, 1], [0, 2, 3]]
[[4, 5, 6, 8, 2], [0, 1, 3]]
[[4, 5, 6, 8, 3], [0, 1, 2]]
也许我误解了这个问题,但如果您希望所有组合都将列表 1 的元素与列表 2 的元素交换,这里有另一种方法。
我们创建嵌套列表的副本并排列这两个列表中的元素。
s = [[0, 4, 5, 6, 8], [1, 2, 3]]
output = []
for i in range(len(s[0])):
for j in range(len(s[1])):
temp_s = [s[0].copy(), s[1].copy()]
temp_s[0][i], temp_s[1][j] = temp_s[1][j], temp_s[0][i]
output.append(temp_s)
输出:
[[[1, 4, 5, 6, 8], [0, 2, 3]],
[[2, 4, 5, 6, 8], [1, 0, 3]],
[[3, 4, 5, 6, 8], [1, 2, 0]],
[[0, 1, 5, 6, 8], [4, 2, 3]],
[[0, 2, 5, 6, 8], [1, 4, 3]],
[[0, 3, 5, 6, 8], [1, 2, 4]],
[[0, 4, 1, 6, 8], [5, 2, 3]],
[[0, 4, 2, 6, 8], [1, 5, 3]],
[[0, 4, 3, 6, 8], [1, 2, 5]],
[[0, 4, 5, 1, 8], [6, 2, 3]],
[[0, 4, 5, 2, 8], [1, 6, 3]],
[[0, 4, 5, 3, 8], [1, 2, 6]],
[[0, 4, 5, 6, 1], [8, 2, 3]],
[[0, 4, 5, 6, 2], [1, 8, 3]],
[[0, 4, 5, 6, 3], [1, 2, 8]]]