通过Python中每个键具有不同值的键过滤字典列表

时间:2018-07-09 18:05:32

标签: python list dictionary counter

我想知道是否有一种更简单的方法来按Python中每个键的值不同的键过滤字典列表 我使用用于键值的列表和用于搜索的键的列表来编写此代码。有用。

示例:

Name = "A", Email = ".com" , Phone Number = "+1 (514"

结果=

{'Name': 'Agueda Pines', 'Email': 'apines@geekpack.com', 'Phone Number': '+1 (514)206-7191', '': ''}

代码:

lst_dicts = [
{'Name':'Agueda Pines','Email':'apines@geekpack.com','Phone Number':'+1 (514)206-7191'},
{'Name':'Angie Holt','Email':'aholt@geekpack.com','Phone Number':'+1 (506)310-8876'},
{'Name':'Arlette Thurgood','Email':'athurgood@gsupptech.com','Phone Number':'+1 (204)507-4424'},
{'Name':'Aurea Luedtke','Email':'aluedtke@gsupptech.com', 'Phone Number': '+1 (306)548-8163'},
{'Name':'Christene Bousquet','Email':'cbousquet@gsupptech.com','Phone Number':'+1 (514)491-3645'},
{'Name':'Dagny Beecher','Email':'dbeecher@gsupptech.com','Phone Number':'+1 (418)870-5530'},
{'Name':'Daniel Jameson','Email':'djameson@4ti.ca','Phone Number':'+1 (647) 953-5588 ext:2555'},
{'Name':'Dominique Pinkley','Email':'dpinkley@geekpack.com','Phone Number':'+1 (403)276-5180'},
{'Name':'Evita Brunk','Email':'ebrunk@geekpack.com','Phone Number':'+1 (604)226-4880'}

]

def get_count_list_dic(self, lst_dicts, srch_txt=[], srch_Keys=[]):
        index = 0
        tmp = lst_dicts
        while index < len(srch_Keys):
                [x.append(k) for k in tmp if srch_txt[index].lower() in k[srch_Keys[index]].lower()]
                tmp = x[:]
                x.clear()
                index += 1
        return len(tmp)

3 个答案:

答案 0 :(得分:1)

字典似乎是组织输入的一种好方法。另外,您可以将sum与生成器表达式结合使用,并使用all

def get_count_list_dic(lst_dicts, srch_dict):
    return sum(all(v in item[k] for k, v in srch_dict.items()) for item in lst_dicts)

d = {'Name': 'A', 'Email': '.com', 'Phone Number': '+1 (514'}

res = get_count_list_dic(lst_dicts, srch_dict=d)  # 1

这里的窍门是要注意boolint的子类,因此您可以对布尔序列求和以计算True元素的数量。

另一种同样有效的方法是将zip与键和值序列一起使用。我更喜欢dict,因为根据构造字典的方式,您会隐式检查每个键是否附加了值。

答案 1 :(得分:0)

当键位于键集中时,您需要一个返回布尔值以进行测试的函数,之后您可以使用filter

len(list(filter(lambda x: '''does a key from my keys match an entry?''', 
                lst_dicts)))

答案 2 :(得分:0)

只需编写一个测试这些条件的函数即可:

def sf(d):
    return 'A' in d['Name'] and '.com' in d['Email'] and '514' in d['Phone Number']

然后,您可以使用filter或列表理解来过滤列表:

 >>> [d for d in lst_dicts if sf(d)]
 [{'Name': 'Agueda Pines', 'Email': 'apines@geekpack.com', 'Phone Number': '+1 (514)206-7191'}]

 >>> filter(sf, lst_dicts)
 [{'Name': 'Agueda Pines', 'Email': 'apines@geekpack.com', 'Phone Number': '+1 (514)206-7191'}]