我有一个字典列表,其中所有字典的结构都类似于:list_of_dict = {'a': 0, 'b':1, 'c': 1, 'd':0, 'e':0, ...}
,即字典将包含所有字母作为键,并且它只能有0,1或-1作为其对应的值。此外,我还有一个动态获取的键列表,例如:filter_list = ['b', 'e', 'g']
我想以这样一种方式过滤list_of_dict
,即我过滤来自list_of_dict
的所有字典,以便我只得到与filter_list
对应的所有值都是zero (0)
的字典
我的代码是这样的:
def filter_list():
zero_list = ['b', 'e', 'g']
list_of_all_dict = [
{'a': 0, 'b':1, 'c': 1, 'd':0, 'e':0, ...},
{'a': 1, 'b':0, 'c': 0, 'd':1, 'e':0, ...},
]
filtered_list = list()
for d in list_of_all_dict:
flag = True
for c in zero_list:
if d[c] != 0:
flag = False
if flag:
filtered_list.append(d)
return filtered_list
它可以工作,但我想知道Python中是否有更好的方法;也许用list(filter(lambda x: all(...)))
方法,我在这一点上无法想到。我并不是真的卡住了,但是我在重构代码时发现了这个问题,并且想知道是否有更好的方法。
欢迎提出任何建议或意见。提前感谢!
我不明白为什么你在函数中定义zero_list
和list_of_all_dict
。函数不应该把它们作为参数吗?
关于逻辑,您可以使用all
而不是使用标志。添加一个推导式,你的函数就可以放在一行中了:
# this will generate dictionaries easily:
import random
import string
LIST_LENGTH = 10
list_of_all_dict = [
dict(zip(string.ascii_lowercase, random.choices([-1, 0, 1], k=26)))
for _ in range(LIST_LENGTH)
]
# define zero list here:
zero_list = ['b', 'e', 'g']
# your function:
def filter_list(dict_list, zero_lst):
return [d for d in dict_list if all(d[k]==0 for k in zero_lst)]
print(filter_list(list_of_all_dict, zero_list))