-1

例如两个数组:

var names = ['Tom','Jerry','Sam'];
var hobbies = ['Eat','Sleep','Laugh'];

是否有一个函数可以将两个数组构造为映射,例如:

{'Tome':'Eat','Jerry':'Sleep','Sam':'Laugh'}
{'Tome':'Sleep','Jerry':'Eat','Sam':'Laugh'}
{'Tome':'Laugh','Jerry':'Eat','Sam':'Laugh'}

和其他 3 个... 总共给定两个数组,返回的地图编号应该是 A33 = 6。通过 javascript 或 python 任何都可以做到。有任何想法吗?


从网上搜索后,这是一个分配问题,解决它的方法称为匈牙利方法。现在我正在寻找通过 javascript 或 python 实现的匈牙利算法。

4

3 回答 3

1

好吧,这不是排列,而是 2 个向量的乘积。在 Python Itertools 中,有一个函数产品可以处理这个问题。

import itertools as itls
names = ['Tom','Jerry','Sam']
hobbies = ['Eat','Sleep','Laugh']
print list(itls.product(names, hobbies))

结果是:[('Tom', 'Eat'), ('Tom', 'Sleep'), ('Tom', 'Laugh'), ('Jerry', 'Eat'), ('Jerry', '睡觉'),('杰瑞','笑'),('山姆','吃'),('山姆','睡觉'),('山姆','笑')]

实际上,2个向量的乘积是对vector1中的每一个和vector2中的每一个做一些'op',在这种情况下,'op'是制作一个元组。产品操作等效于:

for i = 0; i<length(vector1); ++i
    for j = 0; j<length(vector2); ++j
        vector1[i] 'op' vector2[j];
于 2014-05-29T10:42:47.273 回答
0

您希望将名称映射到第二个数组的每个可能排列:

from itertools import permutations

hashmaps = [dict(zip(names, perm)) for perm in permutations(hobbies)]

请注意,它permutations返回一个长度列表,即使长度非常N!,它也会很大。

于 2014-05-29T09:13:23.703 回答
0

我从这个链接Permutations in JavaScript?得到了答案 .

之后,该方法可以这样完成:

function permute(input) {
var permArr = [],
usedChars = [];
function main(){
    var i, ch;
    for (i = 0; i < input.length; i++) {
        ch = input.splice(i, 1)[0];
        usedChars.push(ch);
        if (input.length == 0) {
            permArr.push(usedChars.slice());
        }
        main();
        input.splice(i, 0, ch);
        usedChars.pop();
    }
    return permArr;
}
return main();

}

function mapFromArrays(source,target){
var targets = permute(target);
var returns = [];

for(var t in targets){
    var map = {};
    for(var i=0;i<source.length;i++){
        map[source[i]] = targets[t][i];
    }
    returns.push(map);
}

return returns;

}

于 2014-05-29T10:10:27.370 回答