Python 字典的筛选列表
这是我的例子:Python 字典的筛选列表,python,list,dictionary,Python,List,Dictionary,这是我的例子: dictlist = [{'first': 'James', 'last': 'Joule'}, {'first': 'James','last': 'Watt'}, {'first': 'Christian','last': 'Doppler'}] 我想知道你的姓。如果这是在模型中,则代码为: getdata = Name.objects.filter(name="Christian") getLastName = getda
dictlist = [{'first': 'James', 'last': 'Joule'},
{'first': 'James','last': 'Watt'},
{'first': 'Christian','last': 'Doppler'}]
我想知道你的姓。如果这是在模型中,则代码为:
getdata = Name.objects.filter(name="Christian")
getLastName = getdata.last
我会得到“多普勒”像这样的东西应该有用
last_name = ''
for d in dictList:
if d['first'] == 'Christian':
last_name = d['last']
break
其中,生成的列表
仅包含:
[{'first': 'James', 'last': 'Joule'}, {'first': 'James', 'last': 'Watt'}]
这是一个非常简单的列表理解解决方案:
>>> dictlist = [{'first': 'James', 'last': 'Joule'}, {'first': 'James','last': 'Watt'},{'first': 'Christian','last': 'Doppler'}]
>>> [x['last'] for x in dictlist if x['first'] == 'Christian']
['Doppler']
我有时喜欢使用:
next((如果d['first']=='Christian'),则dictlist中d的d['last'],无)
#“多普勒”
第一个参数是迭代器,第二个(可选)参数是未找到匹配项时返回的默认值
注意:这将只返回第一个匹配结果。因此,如果您希望有多条记录与您的“查询”匹配,那就不太好了。首先,我们可以有一个简单的脚本,只使用内置的,这可能已经足够了:
fl = list(filter(lambda x: x['first'] == 'Christian', dictlist))
# you can't use `.property` because this is a dictionary, not a object
fl[0]['last']
# returns Doppler
我知道您的示例是Django代码,因此,如果您希望使其更具动态性,以便能够通过字典中的任何键进行过滤:
def dict_filter(dictlist: list, key: str, value: str) -> list:
return list(filter(lambda x: x.get(key) == value, dictlist))
dict_filter(dictlist, 'first', 'Christian')
# similar to django's filter method returns a queryset, this returns a list:
# [{'first': 'Christian', 'last': 'Doppler'}]
dict_filter(dictlist, 'last', 'Doppler')
# returns [{'first': 'Christian', 'last': 'Doppler'}]
dict_filter(dictlist, 'last', 'notfound')
# returns []
以及一个用于创建类似于Django的QuerySet.get
方法的函数的示例:
def dict_get(dictlist: list, key: str, value: str) -> list:
ret = list(filter(lambda x: x.get(key) == value, dictlist))
if len(ret) == 0:
raise Exception('Not Found')
if len(ret) > 1:
raise Exception(f'Found more than 1 object with {key}={value}')
return ret[0]
dict_get(dictlist, 'first', 'Christian')
# returns {'first': 'Christian', 'last': 'Doppler'}
dict_get(dictlist, 'first', 'Christians')
# raises Exception: Not Found
dict_get(dictlist, 'first', 'James')
# raises Exception: Found more than 1 object with first=James
希望这对你有帮助 如果
目录列表
是一个列表
,而不是目录
,则允许使用进行可选筛选。这是我最初的想法,但这会导致一个包含单个字符串的列表,我认为这不是最佳的。是的,我想,+1
def dict_filter(dictlist: list, key: str, value: str) -> list:
return list(filter(lambda x: x.get(key) == value, dictlist))
dict_filter(dictlist, 'first', 'Christian')
# similar to django's filter method returns a queryset, this returns a list:
# [{'first': 'Christian', 'last': 'Doppler'}]
dict_filter(dictlist, 'last', 'Doppler')
# returns [{'first': 'Christian', 'last': 'Doppler'}]
dict_filter(dictlist, 'last', 'notfound')
# returns []
def dict_get(dictlist: list, key: str, value: str) -> list:
ret = list(filter(lambda x: x.get(key) == value, dictlist))
if len(ret) == 0:
raise Exception('Not Found')
if len(ret) > 1:
raise Exception(f'Found more than 1 object with {key}={value}')
return ret[0]
dict_get(dictlist, 'first', 'Christian')
# returns {'first': 'Christian', 'last': 'Doppler'}
dict_get(dictlist, 'first', 'Christians')
# raises Exception: Not Found
dict_get(dictlist, 'first', 'James')
# raises Exception: Found more than 1 object with first=James