如果您首先对分组元素排序,则可以使用itertools.groupby() 对您的元素进行分组并测试最小值和最大值。因为这些组是生成器,所以您需要跳过一个额外的圈来将其变成一个列表,您可以将其重用于 min() 和 max() 函数:
from itertools import groupby
from operator import itemgetter
result = {k: (min(item[1] for item in gv), max(item[2] for item in gv))
for k, g in groupby(sorted(inputlist, key=itemgetter(0)), itemgetter(0))
for gv in (list(g),)}
请注意,此排序 (O(NlogN)) 然后在每个组上循环两次以找到每个组的最小值和最大值,在总数中再增加 2N。
附加的for gv in (list(g),) 循环将一个列表分配给gv,其中包含g 组中的所有元素。
简单的循环版本是:
result = {}
for key, v1, v2 in inputlist:
minimum, maximum = result.get(key, (float('inf'), float('-inf')))
if v1 < minimum:
minimum = v1
if v2 > maximum:
maximum = v2
result[key] = (minimum, maximum)
这是一个简单的 O(N) 循环,并且更易于启动。
两种方法的演示:
>>> from itertools import groupby
>>> from operator import itemgetter
>>> inputlist = [(1,2,5),(2,10,13),(5,24,56),(1,8,10),(2,3,11)]
>>> {k: (min(item[1] for item in gv), max(item[2] for item in gv))
... for k, g in groupby(sorted(inputlist, key=itemgetter(0)), itemgetter(0))
... for gv in (list(g),)}
{1: (2, 10), 2: (3, 13), 5: (24, 56)}
和
>>> result = {}
>>> for key, v1, v2 in inputlist:
... minimum, maximum = result.get(key, (float('inf'), float('-inf')))
... if v1 < minimum:
... minimum = v1
... if v2 > maximum:
... maximum = v2
... result[key] = (minimum, maximum)
...
>>> result
{1: (2, 10), 2: (3, 13), 5: (24, 56)}