【问题标题】:Compare integer values between two dictionaries in Python在 Python 中比较两个字典之间的整数值
【发布时间】:2015-07-26 08:42:53
【问题描述】:

此脚本的目标是将客户端软件的当前版本与供应商提供的当前软件版本进行比较。在这个阶段,我只想打印出可用的内容。

我有两个字典设置:

versions = {
    'v80':[80.24,80.16,80.15,80.7],
    'v81':[81.12,81.7,81.4,81.11],
    'v82':[82.7,82.5,82.9,82.6],
    'v83':[83.0,83.1,83.1,83.0]
}
     
client = {
    'client_1':[80.1,80.1,80.1,80.1],
    'client_2':[81.1,80.1,80.1,80.1],
    'client_3':[82.1,80.1,80.1,80.1],
    'client_4':[81.1," ",80.1,80.1],
    'client_5':[80.1," "," "," "]
}

版本 = 可用/客户端 = 客户端正在运行的版本

有 4 个键值代表 4 个不同的应用程序及其所在的版本。

我尝试了几种方法,但都碰壁了。

我想将client_[n] 中的键值与相应版本进行比较(不确定如何将client_3v83client1v80 等联系起来)。比较只是如下:

if client['client_1'][0] < versions['v80'][0]
    print(client.client_1[0],"-->",versions.v80[0])

【问题讨论】:

    标签: python python-3.x dictionary compare


    【解决方案1】:

    您可以使用以下 for 循环:

    >>> for i in range(len(versions)):
    ...     for j in range(len(versions['v8'+str(i)])):
    ...         try:
    ...             if client['client_' + str(i+1)][j] < versions['v8' + str(i)][j]:
    ...                 print ("client_" + str(i+1), "Program_" + str(j+1), client["client_" + str(i+1)][j],"-->",versions["v8"+str(i)][j])
    ...         except TypeError:
    ...             print ("client_" + str(i+1), "Program_" + str(j+1), "Missing")
    ...             continue
    ... 
    client_1 Program_1 80.1 --> 80.24
    client_1 Program_2 80.1 --> 80.16
    client_1 Program_3 80.1 --> 80.15
    client_1 Program_4 80.1 --> 80.7
    client_2 Program_1 81.1 --> 81.12
    client_2 Program_2 80.1 --> 81.7
    client_2 Program_3 80.1 --> 81.4
    client_2 Program_4 80.1 --> 81.11
    client_3 Program_1 82.1 --> 82.7
    client_3 Program_2 80.1 --> 82.5
    client_3 Program_3 80.1 --> 82.9
    client_3 Program_4 80.1 --> 82.6
    client_4 Program_1 81.1 --> 83.0
    client_4 Program_2 Missing
    client_4 Program_3 80.1 --> 83.1
    client_4 Program_4 80.1 --> 83.0
    

    但是,这取决于您提供的信息是否一致,versionsclients 的数量相同,列表长度相同。

    如果你更清楚一点,我可以尝试一个更强大的解决方案。

    【讨论】:

    • 这似乎非常完美,它在功能上唯一没有做的事情是考虑到客户端没有运行程序时(由空白表示)。在我的原始代码中,我有类似“if clinet['client_4'][2]:”的内容来检查值是否存在。
    • 另外,我需要大约 30-60 分钟来解开你的代码并完全理解它是如何工作的......好东西,但我需要一段时间来跟上 :)
    • 我修改它来处理空字符串
    • 对不起,我现在只在 iPad 上,因为我出门在外,想趁你还在的时候抓住你……绝对期望的输出是 (Client_1 program_1 80.1 --> 80.24)、(Client_1 program_2 80.1 --> 80.16) 等等。在我最初的迭代中,我将这些键值命名为 program_1、program_2 等,但目前还没有。我可以在字典中标记它们吗?
    • 天啊,我觉得自己像个大笨蛋,对于 program_1 命名来说是一个很好的解决方案,除了我实际上需要将它们命名为程序名称......我只是让它们在这里被通用命名。您已经超出了我的要求,向您致敬!
    【解决方案2】:

    您可以引入作为接口的第三个字典

    versions = {
    'v80':[80.24,80.16,80.15,80.7],
    'v81':[81.12,81.7,81.4,81.11],
    'v82':[82.7,82.5,82.9,82.6],
    'v83':[83.0,83.1,83.1,83.0]
    }
    
    interface = {
    
    "client_1":"v80",
    "client_2":"v81",
    "client_3":"v82",
    "client_4":"v83",
    "client_5":"v84"
    }
    
    client = {
    'client_1':[80.1,80.1,80.1,80.1],
    'client_2':[81.1,80.1,80.1,80.1],
    'client_3':[82.1,80.1,80.1,80.1],
    'client_4':[81.1," ",80.1,80.1],
    'client_5':[80.1," "," "," "]
    }
    

    现在只需使用以下内容进行比较:

    if client['client_1'][0] < versions[interface["client_1"]][0]:
        print client["client_1"][0],"-->",versions[interface["client_1"]][0]
    

    【讨论】:

    • 这看起来确实是个好主意,但我无法让它发挥作用 :( 看看 user3636636 的解决方案,这似乎是在没有额外表格的情况下做到了。
    • 如果您使用的是 Python 3+,请在 print 语句中包含 ()。这就是它不起作用的原因吗?
    【解决方案3】:

    你可以试试:

    if client['client_1'][0] < versions['v80'][0]:
        print(client["client_1"][0] ,"-->",versions["v80"][0])
    

    为所有客户端和版本执行此操作:

    versions = {
    'v80':[80.24,80.16,80.15,80.7],
    'v81':[81.12,81.7,81.4,81.11],
    'v82':[82.7,82.5,82.9,82.6],
    'v83':[83.0,83.1,83.1,83.0]
    }
    
    client = {
    'client_1':[80.1,80.1,80.1,80.1],
    'client_2':[81.1,80.1,80.1,80.1],
    'client_3':[82.1,80.1,80.1,80.1],
    'client_4':[81.1," ",80.1,80.1],
    'client_5':[80.1," "," "," "]
    }
    
    
    for cli, num_cl in client.items():
        for ver, num in versions.items():
            if int(num[0]) == int(num_cl[0]):
                print(cli, num_cl, ver, num)
    

    还有输出:

    client_4 [81.1, ' ', 80.1, 80.1] v81 [81.12, 81.7, 81.4, 81.11]
    client_5 [80.1, ' ', ' ', ' '] v80 [80.24, 80.16, 80.15, 80.7]
    client_2 [81.1, 80.1, 80.1, 80.1] v81 [81.12, 81.7, 81.4, 81.11]
    client_3 [82.1, 80.1, 80.1, 80.1] v82 [82.7, 82.5, 82.9, 82.6]
    client_1 [80.1, 80.1, 80.1, 80.1] v80 [80.24, 80.16, 80.15, 80.7]
    

    【讨论】:

    • 对不起,我应该提到我需要一种更自动化的方式。现在我有大约 20 个不同版本的客户端。如果我以这种方式设置它,那将是一堆重复的代码,每次客户更改“主要”版本时都必须维护这些代码。我需要从比较 v80 到 v81 进行更新。但是,是的,这是一种享受:)
    猜你喜欢
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多