在两个首选项列表中找到最匹配的

时间:2019-05-23 22:21:20

标签: python

按顺序选择咖啡馆,找到两个朋友的最佳搭配。

  • 朋友1-[1,2,3]
  • 朋友2-[3,1,4]

其中1-> cafe1、2-> cafe2等

我尝试过在匹配的索引中找到最小的差异。但是它在[1,2,3] [2,4,3]

上失败
def find_match(f1,f2):

    difference=len(f1)

    for i in range(len(f1)):
        for j in range(len(f2)):
            if f1[i]==f2[j]:
                curr_diff=abs(i-j)
                if curr_diff<difference:
                    difference=curr_diff
                    print(f1[i])
                    return

对于

 Friend1 - [1 ,2 ,3] 
 Friend2 - [3 ,1 ,4]

输出应为1

对于[1,2,3],[2,4,3]输出应为2

3 个答案:

答案 0 :(得分:0)

不清楚这是否是您要的内容,i + 1似乎很奇怪,但是它会返回符合您要求的正确结果

def best_cafe(l1, l2):
    match = []
    for i, item in enumerate(l1):
        if item not in l2:
            continue
        match.append(i + 1)

    return min(match)


l3 = [1, 2, 3]
l4 = [3, 1, 4]

l1 = [1, 2, 3]
l2 = [2, 4, 3]

print best_cafe(l3, l4)
print best_cafe(l1, l2)

答案 1 :(得分:0)

您应该将订单视为每个咖啡馆的“重量”。这在字典中很容易管理。

friend1 = ["A","B","C"]
friend2 = ["C","A","D"]
votes = dict()
friends = [friend1,friend2]
for preferences in friends:
    for weigth,cafe in enumerate(preferences):
        votes[cafe] = votes.get(cafe,0) + weigth
_,bestCafe = min((v,k) for k,v in votes.items())
print(bestCafe) # A

注意,我在咖啡馆使用字母来避免与索引混淆。最低的重量对应于喜欢的咖啡馆

答案 2 :(得分:0)

单线怎么样?

f1 = [1, 2, 3] 
f2 = [3, 1, 4]

best = min(((i1 + 1) * (i2 + 1), v1) for i1, v1 in enumerate(f1) for i2, v2 in enumerate(f2) if v1 == v2)[1]