【问题标题】:Compare dictionary list values to the list of list values using python使用 python 将字典列表值与列表值列表进行比较
【发布时间】:2019-11-04 10:35:54
【问题描述】:

我有一个字典值和列表值列表。我需要将列表值与字典值进行比较,并通过键值对获取匹配的数据。

我的字典:

res = {
    'cXboTHyIeZaof6x7': ['#de6262', '#ffb88c'],
    '19hyHnlzDMEDJ9N5': ['#ffcc66', '#FFFFFF'],
    'TByXB1YzYSJW2kXO': ['#7A7FBC', '#807CC4'],
    'utTtWdchE2T6vUF5': ['#A3DAC3', '#8BD0D4']
}

我的列表值列表:

diff_tolistoflist = [
    ['#de6262', '#ffb88c'],
    ['#A3DAC3', '#8BD0D4']
]

预期输出:

test = {
    'cXboTHyIeZaof6x7': ['#de6262', '#ffb88c'],
    'utTtWdchE2T6vUF5': ['#A3DAC3', '#8BD0D4']
}

我需要比较 dict 值和值列表以获取具有键值对的相似数据。

【问题讨论】:

标签: python list dictionary difference


【解决方案1】:

您可以使用非常容易阅读的字典理解:

d = {k:v for k,v in res.items() if v in diff_tolistoflist}
print(d)  
# {'cXboTHyIeZaof6x7': ['#de6262', '#ffb88c'], 'utTtWdchE2T6vUF5': ['#A3DAC3', '#8BD0D4']}

【讨论】:

    【解决方案2】:

    如果值是唯一的,我们可以反转我们的字典:

    reversed_dict = {tuple(res[key]): key for key in res}
    

    字典中的键需要是可变的,所以我们必须将它们转换为元组。

    然后我们可以做一个简单的值查找:

    final_result = {}
    for v in diff_tolistoflist:
        k = reversed_dict.get(tuple(v))
        if k:
            final_result[k] = v
    

    我使用了dict.get,以便在出现问题时不会引发异常。

    >>> final_result
    {'cXboTHyIeZaof6x7': ['#de6262', '#ffb88c'], 'utTtWdchE2T6vUF5': ['#A3DAC3', '#8BD0D4']}
    

    此解决方案区分大小写。这意味着,fF 被认为是不同的。为了使其不区分大小写,您可以在反转字典时将字符串转换为小写,然后对 diff_tolistoflist 执行相同操作(在声明它或在循环中查找值时)。

    【讨论】:

      【解决方案3】:

      试试这个,我有用户过滤功能。

      print dict(filter(lambda x:x[1] in diff_tolistoflist,res.items()))
      
      Result:{'cXboTHyIeZaof6x7': ['#de6262', '#ffb88c'], 'utTtWdchE2T6vUF5': ['#A3DAC3', '#8BD0D4']}
      

      【讨论】:

        【解决方案4】:

        您可以使用 dict val_list 检查列表项

        test = {}
        for key, val in res.items():
            if val in diff_tolistoflist:
                test[key] = val
        

        结果

        >>> test
        >>> {'cXboTHyIeZaof6x7': ['#de6262', '#ffb88c'], 'utTtWdchE2T6vUF5': ['#A3DAC3', '#8BD0D4']}
        

        【讨论】:

        • 您不需要第二个循环。只需测试if val in diff_tolistoflist:
        • @accdias,确实,我已经更新了答案,谢谢!
        • 别担心,伙计。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-24
        • 2017-09-05
        • 1970-01-01
        相关资源
        最近更新 更多