Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 字典的筛选列表_Python_List_Dictionary - Fatal编程技术网

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