【发布时间】:2018-12-10 11:05:23
【问题描述】:
我有一个可能性列表和所需的输入:
possibles = [20, 30, 40, 50, 60, 70, 80, 100]
desired = [20, 30, 40]
我想生成 close by 列表。示例:
# Distance of 1 (i.e. 1 element changes to a close-by)
[30, 30, 40]
[20, 40, 40]
[20, 30, 30]
[20, 30, 50]
# Distance of 2:
[40, 30, 40]
[30, 30, 50]
[30, 40, 40]
...
我当前的版本一次只改变一个元素,因此,一旦距离大于 1,我就会错过很多组合。
def generate_close_by(possibles, desired):
for k in range(1, 4):
for i, elt in enumerate(desired):
id = possibles.index(elt)
new = desired[:]
if id < len(possibles)-k-1:
new[i] = possibles[id+k]
yield (new)
if id > k:
new[i] = possibles[id-k]
yield (new)
# Output
[30, 30, 40]
[20, 40, 40]
[20, 30, 50]
[20, 30, 30]
[40, 30, 40]
[20, 50, 40]
[20, 30, 60]
[50, 30, 40]
[20, 60, 40]
[20, 30, 70]
我很确定应该已经存在一个模块来执行这种迭代(itertools?),你能指出我的 write 函数吗?
谢谢。
编辑:
尝试更新...
我正在尝试生成一个与所需大小相同的列表,其中每个元素对应于我必须移动所需元素的数量。
desired = [20, 30, 40]
# Distance of 1:
distance = [1, 0, 0]
distance = [0, 1, 0]
distance = [0, 0, 1]
distance = [-1, 0, 0]
distance = [0, -1, 0]
distance = [0, 0, -1]
然后计划尝试创建新列表,如果不能(超出范围),它会继续。还没有工作,但可能是一个好方法。
【问题讨论】:
-
我不完全理解所需输出背后的逻辑
-
@U9-Forward 顺序无关紧要,我只写了 3 个手工制作的示例......基本上我想要 Hammnig 距离为 1 的所有组合,然后是 Hammnig 距离为 2 的所有组合,然后是 3。距离对应于:元素“移动”了多少的总和。那是我的变量
k -
是
desired始终是possibles的子集? -
@SeljukGülcan 是的,期望总是可能的子集。尺寸 2 到 6。并且总是订购可能的。
-
距离总是2,还是可以改变?
标签: python combinations iterable hamming-distance