Python:如何在没有键的情况下使排序的跳过/删除字典?

2024-10-03 15:29:54 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有以下数组:

pets = [
    {"owner": "Rick", "pet": "Fido"},
    {"owner": "Peter", "pet": "Hunter"},
    {"pet": "Dobbie"},
    {"owner": "Mason", "pet": "Tickles"},
]

我正在寻找一种(最有效的)方法来从列表中完全删除{"pet": "Dobbie"},同时对其进行排序。

如果我要做:

sorted(pets, key=lambda k: k["owner"])

我会得到一个错误,说它没有找到第三个元素的关键。你知道吗

如果我要做:

sorted(pets, key=lambda k: k["owner"] if k.get("owner") else "ZZZ")

它只会将其添加到列表的末尾:

[
    {"owner": "Mason", "pet": "Tickles"},
    {"owner": "Peter", "pet": "Hunter"},
    {"owner": "Rick", "pet": "Fido"},
    {"pet": "Dobbie"},
]

还有一个加号/备选输入:

[
    {"owner": "Mason", "pet": "Tickles"},
    {"owner": "Peter", "pet": "Hunter"},
    {"owner": "Rick", "pet": "Fido"},
    {"owner": None, "pet": "Dobbie"},
]

然而,它现在有一个键,但是有一个空值。这个或原始输入的解决方案对我同样有效。你知道吗

任何指点或想法都将不胜感激。你知道吗


Tags: lambdakey列表数组fidopeterricksorted
2条回答

您可以使用dict.get,它可以提供一个默认返回,而不是它的默认None。你知道吗

sorted(pets, key=lambda x: x.get('owner', 'ZZZ'))

而且operator.methodcaller是比使用lambda更有效的方法:

>>> from operator import methodcaller
>>> sorted(pets, key=methodcaller('get', 'owner', 'ZZZ'))
[{'owner': 'Mason', 'pet': 'Tickles'}, {'owner': 'Peter', 'pet': 'Hunter'}, {'owner': 'Rick', 'pet': 'Fido'}, {'pet': 'Dobbie'}]

您还可以使用filter删除没有所有者的任何dicts

>>> get_owner = methodcaller('get', 'owner')
>>> sorted(filter(get_owner, pets), key=get_owner)
[{'owner': 'Mason', 'pet': 'Tickles'}, {'owner': 'Peter', 'pet': 'Hunter'}, {'owner': 'Rick', 'pet': 'Fido'}]

可以使用生成器表达式进行筛选,然后使用带lambda的sorted

>>> sorted((i for i in pets if 'owner' in i), key=lambda k:k['owner'])
[{'owner': 'Mason', 'pet': 'Tickles'},
 {'owner': 'Peter', 'pet': 'Hunter'},
 {'owner': 'Rick', 'pet': 'Fido'}]

相关问题 更多 >