例如两个数组:
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的匈牙利算法实现。
答案 0 :(得分:1)
import itertools as itls
names = ['Tom','Jerry','Sam']
hobbies = ['Eat','Sleep','Laugh']
print list(itls.product(names, hobbies))
结果是:[(&#39; Tom&#39;,&#39; Eat&#39;),(&#39; Tom&#39;,&#39; Sleep&#39;),(& #39;汤姆&#39;笑&#39;),(&#39; Jerry&#39;,&#39;吃&#39;),(&#39; Jerry&#39;,&# 39;睡眠&#39;),(&#39; Jerry&#39;,&#39;笑&#39;),(&#39; Sam&#39;,&#39; Eat&#39;),(& #39; Sam&#39;,&#39; Sleep&#39;),(&#39; Sam&#39;,&#39; Laugh&#39;)]
实际上,2个向量的产物是做一些&#39; op&#39;对于vector1中的每一个与vector2中的每一个,在这种情况下,&#39; op&#39;是制作一个元组。产品操作与以下方面相同:
for i = 0; i<length(vector1); ++i
for j = 0; j<length(vector2); ++j
vector1[i] 'op' vector2[j];
答案 1 :(得分:0)
您希望将名称映射到第二个数组的每个可能的排列:
from itertools import permutations
hashmaps = [dict(zip(names, perm)) for perm in permutations(hobbies)]
请注意,permutations
会返回长度为N!
的列表,即使非常的长度很短,这个列表也会很大。
答案 2 :(得分: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;
}