【问题标题】:remove a dictionary from a dictionary based on a conditoon根据条件从字典中删除字典
【发布时间】:2020-11-04 19:56:25
【问题描述】:

我想根据条件从嵌套字典中删除字典。

字典:

{1: {'A': [1, 2, 3, 0], 'B': ['ss', 'dd', 'ff', 'aa']},
 2: {'A': [0, 1, 2, 3], 'B': ['ee', 'ff', 'bb', 'gg']},
 3: {'A': [0, 1, 2], 'B': ['ar', 'hh', 'ww']},
 4: {'A': [ 1, 0], 'B': [ 'll', 'jj']}}

如果 'A' == 0,我想删除,然后如果 B 不是以 a 开头,那么我想删除那个特定的字典。

预期:

{1: {'A': [1, 2, 3, 0], 'B': ['ss', 'dd', 'ff', 'aa']},
 
 2: {'A': [0, 1, 2], 'B': ['ar', 'hh', 'ww']},
 }

【问题讨论】:

    标签: python python-3.x pandas dataframe pandas-groupby


    【解决方案1】:

    检查

    s=pd.DataFrame(d)
    
    new_d = s.loc[:,s.loc['B'].str[0].str[0]=='a'].to_dict()
    Out[99]: 
    {1: {'A': [0, 1, 2, 3], 'B': ['aa', 'ss', 'dd', 'ff']},
     3: {'A': [0, 1, 2], 'B': ['ar', 'hh', 'ww']}}
    

    【讨论】:

      【解决方案2】:

      我假设新字典上的键更改是故意的,所以这是一个没有额外库的简单解决方案(nested 是你的字典)

      temp = [x for x in nested.values() if 0 in x['A'] and any([i[0] == 'a' for i in x['B']])]
      new_dict = dict(enumerate(temp, 1))
      

      如果您愿意,可以将其设为单行,或者您可以将条件拆分为函数 像这样

      def check(x):
          if 0 in x['A']:
              return any([i[0] == 'a' for i in x['B']])
          return True
      
      temp = [x for x in nested.values() if check(x)]
      

      现在,如果您更喜欢使用filter(),上述两种变体变为:

      temp = filter(lambda x: 0 in x['A'] and any(i[0] == 'a' for i in x['B']), nested.values())
      

      如果你决定像上面那样声明check(),你可以用这种优雅的方式来做(注意我在这里使用 new_dict,而不是 temp,因为当它如此紧凑时,它确实是有意义的)

      new_dict = dict(enumerate(filter(check, nested.values()),1)
      

      【讨论】:

        【解决方案3】:

        您的问题需要更清楚。 假设您打算删除

        {
         1: {'A': [0, 1, 2, 3], 'B': ['aa', 'ss', 'dd', 'ff']},
         2: {'A': [0, 1, 2], 'B': ['ar', 'hh', 'ww']},
        }
        

        来自

        {1: {'A': [0, 1, 2, 3], 'B': ['aa', 'ss', 'dd', 'ff']},
         2: {'A': [0, 1, 2, 3], 'B': ['ee', 'ff', 'bb', 'gg']},
         3: {'A': [0, 1, 2], 'B': ['ar', 'hh', 'ww']},
         4: {'A': [0, 1], 'B': ['jj', 'll']}}
        

        你可以试试这个:

        import re
        
        r = re.compile("a.*")
        input_dictionary = {
            1: {'A': [0, 1, 2, 3], 'B': ['aa', 'ss', 'dd', 'ff']},
            2: {'A': [0, 1, 2, 3], 'B': ['ee', 'ff', 'bb', 'gg']},
            3: {'A': [0, 1, 2], 'B': ['ar', 'hh', 'ww']},
            4: {'A': [0, 1], 'B': ['jj', 'll']}}
        
        key_list = list(input_dictionary.keys())
        
        for key in key_list:    
            value = input_dictionary[key]
            
            if(any(r.match(b_element) for b_element in value['B']) and 0 in value['A']):
                
                del input_dictionary[key]
                print("Deleting key: ", key)
        
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-02-23
          • 2013-02-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-20
          • 2022-11-16
          相关资源
          最近更新 更多