Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从python目录列表中选择最高值_Python_List_Numpy - Fatal编程技术网

从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)