过滤字典列表

9
这是我的例子:
dictlist = [{'first': 'James', 'last': 'Joule'}, 
            {'first': 'James','last': 'Watt'},
            {'first': 'Christian','last': 'Doppler'}]

我正尝试获取姓氏。如果这是一个模型,代码将会是:

getdata = Name.objects.filter(name="Christian")
getLastName = getdata.last

我会得到"多普勒"


列表推导式允许使用 if 进行可选过滤。 - bereal
7个回答

21

这是使用列表推导式的非常简单的解决方案:

>>> dictlist = [{'first': 'James', 'last': 'Joule'}, {'first': 'James','last': 'Watt'},{'first': 'Christian','last': 'Doppler'}]
>>> [x['last'] for x in dictlist if x['first'] == 'Christian']
['Doppler']

这是我最初想到的,但这会导致一个只有一个字符串的列表,我认为这不是最优的。 - Tim
是的,我想是这样,+1。 - Tim

10
dictlist = [{'first': 'James', 'last': 'Joule'}, {'first': 'James','last': 'Watt'},{'first': 'Christian','last': 'Doppler'}]
the_jameses = [d for d in dictlist if d['first'] == 'James']

生成的list仅包含以下内容:

[{'first': 'James', 'last': 'Joule'}, {'first': 'James', 'last': 'Watt'}]

4

首先,我们可以编写一个简单的脚本,它只使用内置的Python filter方法,这可能已经足够了:

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 []

下面是一个使用 Python filter 方法 创建类似于 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

希望这对你有所帮助!

3

这样的东西应该可以工作

last_name = ''

for d in dictList:
  if d['first'] == 'Christian':
    last_name = d['last']
    break

2

我有时候喜欢使用next函数:

next((d['last'] for d in dictlist if d['first'] == 'Christian'), None)
# 'Doppler'

第一个参数是迭代器,第二个(可选)参数是如果没有找到匹配条目时返回的默认值。

注意:这将仅返回第一个匹配结果。因此,如果您希望有多个记录与您的“查询”匹配,则不太好。


-3

希望这对你有所帮助!

"; my_dict=[
{
    'username':"Siva",
    'phoneno':"12345678915",
    'city':"Chennai"
},
{
    'username':"Sundhar",
    'phoneno':"12345678917",
    'city':"Vellore"
},
    {
    'username':"cockroach",
    'phoneno':"12345668919",
    'city':"Chennai"
},
    {
        'username':"oggy",
        'phoneno':"12345678917",
        'city':"Chennai"
    }
]

";phoneno="12345678917"

result = [my_dict中符合phoneno条件的user['username']]


1
这个答案到底在说什么?你为什么后来加了 "; - General Grievance

-4
for comp in dictlist:
    if comp["first"] == 'Christian':
        return comp["last"]

3
dictlist是一个列表(list),而不是字典(dict)。 - bruno desthuilliers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接