【问题标题】:check the value from the list against key value from dictionary Python根据字典 Python 的键值检查列表中的值
【发布时间】:2020-08-05 14:30:11
【问题描述】:

我有两个数据源,一个是列表,另一个是字典列表。 我的数据如下所示:

need_placeholder = ['1200', '1300', '1400']
ad_dict = [{"Name": "A", "ID": "1999"}, {"Name": "B", "ID": "1299"}, 
           {"Name": "C", "ID": "1400"}]

我需要检查need_placeholders 项目是否等于来自ad_dictID 值。这是我的脚本:

for item in need_placeholder:
    adpoint_key = item 
    for index, my_dict in enumerate(ad_dict):
        if my_dict["ID"] == adpoint_key:
            continue
        else:    
            print(f'No key exists for {adpoint_key}')

输出是:

No key exists for 1200
No key exists for 1200
No key exists for 1200
No key exists for 1300
No key exists for 1300
No key exists for 1300

我想要的输出是:

No key exists for 1200
No key exists for 1300

如何在不遍历字典或列表的情况下比较这些值?

【问题讨论】:

  • 我建议使用一个类而不是一个列表中的那么多字典
  • 我必须保持当前格式。

标签: python list dictionary compare key-value


【解决方案1】:

您的else 在循环中的错误位置。该内部循环为每个输出运行多次。如果您首先将 ID 值提取到集合中,则可以完全避免该循环:

need_placeholder = ['1200', '1300', '1400']
ad_dict = [{"Name": "A", "ID": "1999"}, {"Name": "B", "ID": "1299"}, {"Name": "C", "ID": "1400"}]

ad_values = set(d['ID'] for d in ad_dict)

for v in need_placeholder:
    if v not in ad_values:
        print(f'no key exits for {v}')

打印:

no key exits for 1200
no key exits for 1300

如果顺序不重要,您可以将整个事情作为一个单独的集合操作来完成:

for v in set(need_placeholder) - ad_values:
    print(f'no key exits for {v}')

【讨论】:

    【解决方案2】:

    你可以试试这个。

    >>> need_placeholder = ['1200', '1300', '1400']
    >>> ad_dict = [{"Name": "A", "ID": "1999"}, {"Name": "B", "ID": "1299"}, 
                   {"Name": "C", "ID": "1400"}]
    >>> keys={d['ID'] for d in ad_dict} # Set of all unique ID values
    >>> [key for key in need_placeholder if not key in keys]
    # ['1200', '1300']
    

    您可以使用itertools.filterfalse

    list(filterfalse(lambda x:x in keys, need_placeholder))
    # ['1200', '1300']
    

    如果你不关心订单

    set(need_placeholder)-keys
    # {'1300', '1200'}
    

    使用all

    >>> for key in need_placeholder:
    ...     if all(key != d['ID'] for d in ad_dict):
    ...         print(f'No key exists for {key}')
    ...
    No key exists for 1200
    No key exists for 1300
    

    使用for-else

    >>> for key in need_placeholder:
    ...     for d in ad_dict:
    ...             if key==d['ID']:
    ...                     break
    ...     else:
    ...             print(f'No key {key}')
    ...
    No key 1200
    No key 1300
    

    【讨论】:

      【解决方案3】:

      一种快速的方法是使用嵌套列表推导

      [print('No key for {}'.format(x)) for x in need_placeholder if x not in [y['ID'] for y in ad_dict]]
      

      【讨论】:

        【解决方案4】:
        allowed_values = {dic["ID"] for dic in ad_dict}
        
        for item in need_placeholder:
            if item not in allowed_values:
                print(f'No key exists for {item}')
        

        【讨论】:

          【解决方案5】:
          for item in need_placeholder:
              adpoint_key = item
              duplicate_exist = False # flag that will be update if key exists
              for index, my_dict in enumerate(ad_dict):
                  if my_dict["ID"] == adpoint_key:
                      duplicate_exist = True    # flag is updated as key exists
              not duplicate_exist and print(f'No key exists for {adpoint_key}') # for all non duplicate print function is invoked at the end of inner loop
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-01-19
            • 2015-05-17
            • 1970-01-01
            • 1970-01-01
            • 2020-02-06
            • 1970-01-01
            • 2014-03-14
            • 1970-01-01
            相关资源
            最近更新 更多