python过滤dict的dict列表,其中包含几个键值对作为条件

时间:2016-04-09 23:07:03

标签: python list dictionary filter matching

我的示例数据:

list_of_dict =[{'cena': 23, 'nazwa': 'item1', 'param': 'pampam'},
               {'cena': 26, 'nazwa': 'item2', 'param': 'iko'   },
               {'cena': 26, 'nazwa': 'item2a','param': 'ik2'   },
               {'cena': 26, 'nazwa': 'item2b','param': 'ik2'   },
               {'cena': 17, 'nazwa': 'item3', 'param': 'etr'   },
               {'cena': 17, 'nazwa': 'item4', 'param': 'asdf'  }]

conditions =   {'cena': 26, 'param': 'ik2' }

我试过了:

if conditions in list_of_dict:
    do_something()

它可以工作,但只有当整个条件dict(每个键)匹配dict列表中的那个时,我的意思是:

In [1]: exampleSet =      [{  'type' : 'type1', 'k' : 'kval'},
   ...:                    {  'type' : 'type2', 'k' : 'kv2' },
   ...:                    {  'type' : 'type2', 'k' : 'k3'  },
   ...:                    {  'type' : 'type3', 'k' : 'k3'  }]
   ...: 
   ...: conditions =       {  'type' : 'type1', 'k' : 'kval' }
   ...: 
   ...: 
   ...: conditions in exampleSet
   ...: 
Out[1]: True
In [2]: conditions =       {  'type' : 'type1' }

In [3]: conditions in exampleSet
Out[3]: False

当我尝试将字典与指定的键值对匹配时(无论值是否/存在未指定的那些)所以

In [4]: exampleSet =      [{  'type' : 'type1', 'k' : 'kval'},
   ...:                    {  'type' : 'type2', 'k' : 'kv2' },
   ...:                    {  'type' : 'type2', 'k' : 'k3'  },
   ...:                    {  'type' : 'type3', 'k' : 'k3'  }]
   ...: 
   ...: conditions =       {  'type' : 'type2' }
   ...:
   ...: my_wanted_match( exampleSet, conditions )

必须返回:

                     [{  'type' : 'type2', 'k' : 'kv2' },
                      {  'type' : 'type2', 'k' : 'k3'  }]

结果。

任何人都可以提供一些关于如何实现这一目标的提示吗?

5 个答案:

答案 0 :(得分:2)

这是您想要的filter() - 您希望根据某些条件过滤您的词典列表;仅返回符合所有条件的条目。

>>> list_of_dict =[{'cena': 23, 'nazwa': 'item1', 'param': 'pampam'},
...                {'cena': 26, 'nazwa': 'item2', 'param': 'iko'   },
...                {'cena': 26, 'nazwa': 'item2a','param': 'ik2'   },
...                {'cena': 26, 'nazwa': 'item2b','param': 'ik2'   },
...                {'cena': 17, 'nazwa': 'item3', 'param': 'etr'   },
...                {'cena': 17, 'nazwa': 'item4', 'param': 'asdf'  }]

设定条件:

>>> conditions = {'param':'iko'}

做一个单行过滤器:

>>> filter(lambda item: all((item[k]==v for (k,v) in conditions.iteritems())), list_of_dict)
[{'cena': 26, 'param': 'iko', 'nazwa': 'item2'}]

答案 1 :(得分:1)

这将遍历SELECT s.name, s.courseid, c.name, c.classroom, s.score, g.letter FROM students AS s INNER JOIN courses AS c ON s.courseid=c.courseid INNER JOIN gradingscheme AS g ON CASE g.letter WHEN s.score BETWEEN g.lower AND g.upper 中的每个字典,并将具有匹配键值对的字典返回给每个条件。

list_of_dict

答案 2 :(得分:1)

使用列表理解:

>>> list_of_dict =[{'cena': 23, 'nazwa': 'item1', 'param': 'pampam'},
...                {'cena': 26, 'nazwa': 'item2', 'param': 'iko'   },
...                {'cena': 26, 'nazwa': 'item2a','param': 'ik2'   },
...                {'cena': 26, 'nazwa': 'item2b','param': 'ik2'   },
...                {'cena': 17, 'nazwa': 'item3', 'param': 'etr'   },
...                {'cena': 17, 'nazwa': 'item4', 'param': 'asdf'  }]
>>> 
>>> conditions =   {'cena': 26, 'param': 'ik2' }
>>> [d for d in list_of_dict if all((k in d and d[k] == v) for k, v in conditions.items())]
[{'cena': 26, 'param': 'ik2', 'nazwa': 'item2a'}, {'cena': 26, 'param': 'ik2', 'nazwa': 'item2b'}]

答案 3 :(得分:0)

SELECT ((COUNT(?bw_bad) AS ?total_bad)/(COUNT(?bw) AS ?total)*100) WHERE

或简单地说:

SELECT (COUNT(?bw_bad)* 100 / (COUNT(?bw)) as ?total) WHERE

答案 4 :(得分:0)

set在这里派上用场了 *

has_match = any(set(condition.items()) <= set(d.items()) for d in listOfDict)

或第二部分:

the_matches = [
    d
    for d in listOfDict
    if set(condition.items()) <= set(d.items())
]

<=是应用于集合时的子集运算符:

  

issubset(other)
  set <= other

     

测试集合中的每个元素是否都在其他元素中。

* ,前提是您可以确保您的值是可清除的,即不是列表或词组