根据Python中的键/值过滤词典和创建子词典?

Cra*_*erb 5 python dictionary list filter

好吧,我被卡住了,需要一些帮助......

如果我有一个这样的主词典:

data = [ {"key1": "value1", "key2": "value2", "key1": "value3"},  
{"key1": "value4", "key2": "value5", "key1": "value6"}, 
{"key1": "value1", "key2": "value8", "key1": "value9"} ]
Run Code Online (Sandbox Code Playgroud)

现在,我需要通过该字典来格式化一些数据,即:

for datadict in data:  
    for key, value in datadict.items():  
    ...filter the data...
Run Code Online (Sandbox Code Playgroud)

现在,我将如何在同一个循环中以某种方式(如果可能的话......如果没有,请提出替代方案)检查某些键的值,如果这些值与我的预设相匹配,那么我会将整个列表添加到另一个字典中,从而有效根据某些键和值,当我从这个主词典中走出来时创建较小的词典?

所以,假设我想创建一个子字典,其中包含key1值为"value1"的所有列表,对于上面的列表,我会给出类似下面的内容:

subdata = [ {"key1": "value1", "key2": "value2", "key1": "value3"},  
{"key1": "value1", "key2": "value8", "key1": "value9"} ]
Run Code Online (Sandbox Code Playgroud)

Sku*_*del 9

这是一个不那么漂亮的方式.结果是一个生成器,但如果你真的想要一个列表,你可以通过调用来包围它list().大多数情况并不重要.

谓词是一个函数,如果列表中的字典要剪切它,则决定每个键/值对.默认值接受全部.如果字典中没有k/v对匹配则拒绝.

def filter_data(data, predicate=lambda k, v: True):
    for d in data:
         for k, v in d.items():
               if predicate(k, v):
                    yield d


test_data = [{"key1":"value1", "key2":"value2"}, {"key1":"blabla"}, {"key1":"value1", "eh":"uh"}]
list(filter_data(test_data, lambda k, v: k == "key1" and v == "value1"))
# [{'key2': 'value2', 'key1': 'value1'}, {'key1': 'value1', 'eh': 'uh'}]
Run Code Online (Sandbox Code Playgroud)

  • "不太漂亮"?不同意.这非常好. (2认同)
  • @Skurmedel:你的功能优雅,很容易看到它如何通过简单的步骤完成工作; 它节省了读者不得不在头脑中解析复杂的单线程. (2认同)