我有一个问题,我有点难以解释所以我将使用大量的例子来帮助你们理解并看看你是否能帮助我.
假设我有两个列表,其中包含两个人从最好到最差评价的书名. User1评级为lstA,user2评级为lstB
lstA = ['Harry Potter','1984','50 Shades','Dracula'] lstB = ['50 Shades','Dracula','Harry Potter']
用户认为’哈利波特’比’德拉库拉’更好(惠普是指数0,德古拉是指数3)
用户2认为“哈利波特”比德古拉更糟糕(惠普是指数3,德古拉是指数1)
在这种情况下,返回一个元组(‘哈利波特’,’德古拉’)[(‘德古拉’,’哈利波特’)也很好]
用户1也比’Dracula’更好地评价’50色调’,用户2也比’Dracula'(分别为2号,3号和0号)更好地评价’50色调’.在这种情况下,没有任何反应.
该程序的最终结果应该返回一个元组列表,所以,
[('Harry Potter','50 Shades'),('Harry Potter','Dracula'),'1984'),('1984','Dracula')]
有人可以帮我指出正确的方向来提出一个给出所有元组的算法吗?
解决方法
首先以数学方式制定你的逻辑.对于长度为2的所有组合,给定索引idx_a1,idx_a2和idx_b1,idx_b2,如果是sign(idx_a1-idx_a2)!= sign(idx_b1-idx_b2),则记录组合.
from itertools import combinations lstA = ['Harry Potter','Harry Potter'] def sign(x): """Return +1 if integer is positive,-1 if negative""" return (x > 0) - (x < 0) res = [] for a,b in combinations(lstA,2): idx_a1,idx_a2 = lstA.index(a),lstA.index(b) idx_b1,idx_b2 = lstB.index(a),lstB.index(b) if sign(idx_a1 - idx_a2) != sign(idx_b1 - idx_b2): res.append((a,b)) [('Harry Potter','Dracula')]