在嵌套的字典列表上使用 itemgetter 发出问题

问题描述 投票:0回答:4

我正在尝试按特殊编号升序排列此嵌套列表。我尝试过使用 itemgetter 但收到打字错误。不太确定这里的解决方案是什么。谢谢!

from operator import itemgetter

nested = [
   [{'time': 5, 'ask price': 8}, {'ID': 'AA', 'Special number': 0.1}], 
   [{'time': 5, 'ask price': 8}, {'ID': 'BB', 'Special number': 0.15}],
   [{'time': 5, 'ask price': 8}, {'ID': 'CC', 'Special number': 0.05}]
]

print(nested.sort(key=itemgetter('Special number'))) 

错误:

TypeError: list indices must be integers or slices, not str
python list dictionary nested
4个回答
2
投票

试试这个:

print(sorted(nested, key=lambda x: x[1]['Special number']))

您之前所做的不起作用,因为您尝试使用字符串为每个列表建立索引。然而,您真正想要的是字典中的“特殊号码”字段,它是每个列表的第二项。 这翻译成

[1]['Special number']

结果:

[[{'ask price': 8, 'time': 5}, {'ID': 'CC', 'Special number': 0.05}],
 [{'ask price': 8, 'time': 5}, {'ID': 'AA', 'Special number': 0.1}],
 [{'ask price': 8, 'time': 5}, {'ID': 'BB', 'Special number': 0.15}]]

2
投票

您可以组合两个operator.itemgetter函数。

import operator

nested = [
   [{'time': 5, 'ask price': 8}, {'ID': 'AA', 'Special number': 0.1}], 
   [{'time': 5, 'ask price': 8}, {'ID': 'BB', 'Special number': 0.15}],
   [{'time': 5, 'ask price': 8}, {'ID': 'CC', 'Special number': 0.05}]
]

one = operator.itemgetter(1)
special = operator.itemgetter('Special number')

nested.sort(key=lambda x: special(one(x)))

print(nested)

2
投票

由于

operator.itemgetter
不知道如何处理嵌套结构,所以让我们编写自己的
nested_itemgetter

def nested_itemgetter(*path):
    def browse(xs):
        for i in path:
            xs = xs[i]
        return xs
    return browse

然后您可以使用

nested_itemgetter(1, 'Special number')
作为排序键:

nested = [
   [{'time': 5, 'ask price': 8}, {'ID': 'AA', 'Special number': 0.1}], 
   [{'time': 5, 'ask price': 8}, {'ID': 'BB', 'Special number': 0.15}],
   [{'time': 5, 'ask price': 8}, {'ID': 'CC', 'Special number': 0.05}]
]

nested.sort(key=nested_itemgetter(1, 'Special number'))

0
投票

有点无耻的插件,但我已经多次遇到类似的问题,以至于我编写了一个通用项目和 attr getter。您可以在

haggis.recipes.chained_getter
找到它。源代码可在 GitLab 上找到。

由于非数字索引可以包含真正任意的内容,因此我选择了带有占位符的格式字符串,而不是尝试解析这些对象或强制用户转义字符串。作为一种快捷方式,整数索引可以直接放置在格式字符串中,因为它们可以被明确地解析。在您的特定用例中,您有一个数字索引和一个字符串索引,如下所示:

nested.sort(key=chained_getter('[1][]', 'Special number'))

nested.sort(key=chained_getter('[][]', 1, 'Special number'))

这里的妙处在于,您还可以从中间对象中提取属性。

© www.soinside.com 2019 - 2024. All rights reserved.