我正在尝试按特殊编号升序排列此嵌套列表。我尝试过使用 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
试试这个:
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}]]
您可以组合两个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)
由于
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'))
有点无耻的插件,但我已经多次遇到类似的问题,以至于我编写了一个通用项目和 attr getter。您可以在
haggis.recipes.chained_getter
找到它。源代码可在 GitLab 上找到。
由于非数字索引可以包含真正任意的内容,因此我选择了带有占位符的格式字符串,而不是尝试解析这些对象或强制用户转义字符串。作为一种快捷方式,整数索引可以直接放置在格式字符串中,因为它们可以被明确地解析。在您的特定用例中,您有一个数字索引和一个字符串索引,如下所示:
nested.sort(key=chained_getter('[1][]', 'Special number'))
或
nested.sort(key=chained_getter('[][]', 1, 'Special number'))
这里的妙处在于,您还可以从中间对象中提取属性。