为了账号安全,请及时绑定邮箱和手机立即绑定

元素列表比较

元素列表比较

慕码人2483693 2021-08-05 16:16:51
我有一个问题,我有点难以解释,所以我将使用大量示例来帮助大家理解,看看是否可以帮助我。假设我有两个列表,其中包含两个人评分从最佳到最差的书名。User1 评分lstA和 user2 评分lstBlstA = ['Harry Potter','1984','50 Shades','Dracula']lstB = ['50 Shades','Dracula','1984','Harry Potter']用户一认为“哈利波特”比“德古拉”好(HP指数为0,德古拉指数为3)用户二认为'哈利波特'比德古拉更糟糕,(HP指数为3,德古拉指数为1)在这种情况下,返回一个元组('Harry Potter', 'Dracula')[('Dracula', 'Harry Potter')也可以]用户一也将“50 种色调”评为“50 种色调”好于“德古拉”,用户 2 也将“50 种色调”评为“50 种色调”好于“德古拉”(分别为指数 2、3 和 0、1)。在这种情况下,什么也不会发生。程序的最终结果应该返回一个元组列表,所以,[('Harry Potter','50 Shades'), ('Harry Potter','Dracula'), ('Harry Potter','1984'), ('1984', '50 Shades'), ('1984','Dracula')]有人可以帮我指出正确的方向来提出一个给出所有元组的算法吗?
查看完整描述

3 回答

?
慕虎7371278

TA贡献1802条经验 获得超4个赞

首先用数学公式表达你的逻辑。对于长度为 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','1984','50 Shades','Dracula']

lstB = ['50 Shades','Dracula','1984','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', '1984'),

 ('Harry Potter', '50 Shades'),

 ('Harry Potter', 'Dracula'),

 ('1984', '50 Shades'),

 ('1984', 'Dracula')]


查看完整回答
反对 回复 2021-08-05
  • 3 回答
  • 0 关注
  • 168 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号