从python目录列表中选择最高值
在目录列表中:从python目录列表中选择最高值,python,list,numpy,Python,List,Numpy,在目录列表中: A = [ [{'x': 1, 'y': 0}, {'x': 2, 'y': 3}, {'x': 3, 'y': 4}, {'x': 4, 'y': 7}], [{'x': 1, 'y': 0}, {'x': 2, 'y': 2}, {'x': 3, 'y': 13}, {'x': 4, 'y': 0}], [{'x': 1, 'y': 20}, {'x': 2, 'y': 4}, {'x': 3, 'y': 0}, {'x': 4
A = [
[{'x': 1, 'y': 0}, {'x': 2, 'y': 3}, {'x': 3, 'y': 4}, {'x': 4, 'y': 7}],
[{'x': 1, 'y': 0}, {'x': 2, 'y': 2}, {'x': 3, 'y': 13}, {'x': 4, 'y': 0}],
[{'x': 1, 'y': 20}, {'x': 2, 'y': 4}, {'x': 3, 'y': 0}, {'x': 4, 'y': 8}]
]
我需要从每个dict列表中检索最高的“y”值…因此结果列表将包含:
Z = [(4, 7), (3,13), (1,20)]
在A中,“x”是每个dict的键,“y”是每个dict的值
有什么想法吗?谢谢。
max
接受可选的键
参数
[max(((d['x'], d['y']) for d in l), key=lambda t: t[1]) for l in A]
A = [
[{'x': 1, 'y': 0}, {'x': 2, 'y': 3}, {'x': 3, 'y': 4}, {'x': 4, 'y': 7}],
[{'x': 1, 'y': 0}, {'x': 2, 'y': 2}, {'x': 3, 'y': 13}, {'x': 4, 'y': 0}],
[{'x': 1, 'y': 20}, {'x': 2, 'y': 4}, {'x': 3, 'y': 0}, {'x': 4, 'y': 8}]
]
Z = []
for a in A:
d = max(a, key=lambda d: d['y'])
Z.append((d['x'], d['y']))
print Z
更新
建议人–J.F.塞巴斯蒂安:
from operator import itemgetter
Z = [itemgetter(*'xy')(max(lst, key=itemgetter('y'))) for lst in A]
我会使用
itemgetter
和max
的键
参数:
from operator import itemgetter
pair_getter = itemgetter('x', 'y')
[pair_getter(max(d, key=itemgetter('y'))) for d in A]
已经给出了所述问题的解决方案,但我建议更改基础数据结构。元组对于点这样的小元素要快得多。如果您愿意,可以使用
namedtuple
保持词典的清晰性
>>> from collections import namedtuple
>>> A = [
[{'x': 1, 'y': 0}, {'x': 2, 'y': 3}, {'x': 3, 'y': 4}, {'x': 4, 'y': 7}],
[{'x': 1, 'y': 0}, {'x': 2, 'y': 2}, {'x': 3, 'y': 13}, {'x': 4, 'y': 0}],
[{'x': 1, 'y': 20}, {'x': 2, 'y': 4}, {'x': 3, 'y': 0}, {'x': 4, 'y': 8}]
]
制作点
namedtuple很简单
>>> Point = namedtuple('Point', 'x y')
这就是实例的外观
>>> Point(x=1, y=0) # Point(1, 0) also works
Point(x=1, y=0)
A
将是这样的
>>> A = [[Point(**y) for y in x] for x in A]
>>> A
[[Point(x=1, y=0), Point(x=2, y=3), Point(x=3, y=4), Point(x=4, y=7)],
[Point(x=1, y=0), Point(x=2, y=2), Point(x=3, y=13), Point(x=4, y=0)],
[Point(x=1, y=20), Point(x=2, y=4), Point(x=3, y=0), Point(x=4, y=8)]]
现在这样工作容易多了:
>>> from operator import attrgetter
>>> [max(row, key=attrgetter('y')) for row in A]
[Point(x=4, y=7), Point(x=3, y=13), Point(x=1, y=20)]
要保留元组的速度优势,最好通过索引进行访问:
>>> from operator import itemgetter
>>> [max(row, key=itemgetter(2)) for row in A]
[Point(x=4, y=7), Point(x=3, y=13), Point(x=1, y=20)]
请注意,这不是一种有效的方法,但这是获得所需结果的方法之一。或者作为列表理解:
Z=[itemgetter(*'xy')(max(lst,key=itemgetter('y'))for lst in a]
这看起来很棒。对于任何想知道itemgetter(*'xy')
等同于itemgetter('x','y')
(为了清晰起见,我更喜欢后者,但这看起来也不错)+1个不错的!itemgetter博士:你为什么给这个小家伙贴标签?此外,元组看起来是一种使用起来快得多的数据结构,如果您愿意,可以通过使用集合来保持字典的清晰度。namedtuple
result=[]
for item in a:
new = sorted(item, key=lambda k: k['y'],reverse=True)
result.append((new[0]['x'],new[0]['y']))
print(result)