【问题标题】:How can I filter a dictionary and store the values in a list?如何过滤字典并将值存储在列表中?
【发布时间】:2021-04-06 00:07:16
【问题描述】:

我想在字典中搜索相似的值并将值存储在列表中。 这是从 yaml 加载字典的一小部分:

global_var:
  rt_id: 12345
var_rtr_a:
  subnet: 10.10.1.0/28
var_rtr_b:
  subnet: 10.10.2.0/28

我用这段代码试过了

key = ['subnet']
values = list(map(mydictionray.get, keys)
# Output: [none]

我明白为什么输出是None,因为密钥不正确。 但是如何定义正确的键?

【问题讨论】:

    标签: python yaml


    【解决方案1】:

    我已将我的代码编辑成一个函数。数据就是字典

    def search_dict(data):
        keys=['var_rtr_a','subnet','var_rtr_b','subnet']
        output=list(map(data.get,keys))
        print(output)
        return output
    
    Output: [{'subnet': '10.10.1.0/28'}, None, {'subnet': '10.10.2.0/28'}, None]
    

    但这不是我需要的,我只需要键中的值..

    【讨论】:

      【解决方案2】:

      这是一个字典。

      寻求递归解决方案:

      def recursive_key_search(key, lookup):
          if isinstance(lookup, dict):
              for _key in lookup.keys():
                  if _key == key:
                      output.append(lookup[key])
                  recursive_key_search(key, lookup[_key])
      

      使用示例:

      test_dict = {
          'a': 'b',
          'c': {'d': 'e'}
      }
      
      output = []
      
      recursive_key_search('d', test_dict)
      
      print(output)
      # >>> ['e']
      
      

      【讨论】:

      • 我测试了你的代码。问题是,我的听写。输出有 27 个 emty 列表.. 和两个子网列表...
      • 您只能附加if lookup[key] is not None 来解决这个问题。
      【解决方案3】:

      数据的格式化方式是在字典中使用字典。当您查找subnet 时,您只查看第一层字典,而不是子网所属的第二层。

      我能想到的一种修改方法是遍历字典的外部值,然后在其中搜索子网:

      def search_dict(data):
           output = []
           for k in data:
                try:
                     output.append(data[k]['subnet'])
           return output
      

      这将正确地从字典中获取每个子网并将其输出到一个列表中。

      Output:
      ['10.10.1.0/28', '10.10.1.0/28']
      

      【讨论】:

        【解决方案4】:

        我将代码更改为您的示例,但不起作用。

        def search_dict(data):
            output = []
            for k in data:
                #try:
                     output.append(data[k]['subnet'])
            return output
        
        if __name__ == '__main__':
            data = read_file("data_input.yaml")
            search_dict(data)
            subnet = search_dict(data)
            print(subnet)
        
        Output:
             29     for k in data:
             30         #try:
        ---> 31             output.append(data[k]['subnet'])
             32     #print(output)
             33     return output
        
        KeyError: 'subnet'
        

        我们可以再检查一下代码吗

        【讨论】:

          【解决方案5】:

          好的,我尝试使用这篇文章中的示例进行过滤:

          How to filter a nested dictionary (pythonic way) for a specific value using map or filter instead of list comprehensions?

          但它不适用于我的字典。

          这是我的测试: 检查:

          In [6]: data.values()
          Out[6]: dict_values([{'rt_id': 12345}, {'subnet': '10.10.1.0/28'}, {'subnet': '10.10.2.0/28'}])
          
          In [7]: data.items()
          Out[7]: dict_items([('global_var', {'rt_id': 12345}), ('var_rtr_a', {'subnet': '10.10.1.0/28'}), ('var_rtr_b', {'subnet': '10.10.2.0/28'})])
          
          In [8]: data.keys()
          Out[8]: dict_keys(['global_var', 'var_rtr_a', 'var_rtr_b'])
          
          In [11]: type(data)
          Out[11]: dict
          
          Here my filter with error:
          In [12]: list(filter(lambda x: x['subnet'] , data.values()))
          KeyError: 'subnet'
          
          In [3]: list(filter(lambda x: x['var_rtr_a']['subnet'], data.values()))
          KeyError: 'var_rtr_a'
          

          问题:过滤器的正确键是什么?和 wy 子网不是正确的键吗?

          所以当我有一个 eays dict 时。过滤器工作正常

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-05-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-12-07
            • 1970-01-01
            • 2022-11-02
            • 2021-07-31
            相关资源
            最近更新 更多