Python中合并两个列表并返回集合的最小/最大值的最佳方法

2 投票
2 回答
1720 浏览
提问于 2025-04-17 02:20

我现在有两个列表,里面包含了“步骤”和“时间”的组合:

step = 1,1,1,1,2,2,2,2
time = 1,2,5,6,1,3,5,6

这些值是直接相关的,也就是说,像这样的元组 [(1,1),(1,2),(1,5),(1,6),(2,1),(2,3),(2,5),(2,11)]

简单来说,我想找出步骤1的最大值和最小值,还有步骤2的最小值和最大值。

minstep1 = 1
maxstep1 = 6
minstep2 = 1
maxstep2 = 11

我该怎么在Python中实现这个呢?我需要创建一个多维列表吗?有没有什么函数可以用来遍历元组中的键值对,我可以直接使用zip函数吗?

谢谢!

2 个回答

0

这个方法怎么样呢?

step = [1,1,1,1,2,2,2,2]
time = [1,2,5,6,1,3,5,6]

from collections import defaultdict
dd = defaultdict(set)

for s,t in zip(step, time):
    dd[s].add(t)

for k,v in dd.iteritems():
    print "step %d  min: %d max: %d" %(k, min(v), max(v))
2

你可以看看 itertools.groupby 这个工具。这里有一些示例代码可以帮助你理解:

step = 1,1,1,1,2,2,2,2
time = 1,2,5,6,1,3,5,6

from itertools import groupby, izip
from operator import itemgetter

for key, group in groupby(izip(step, time), itemgetter(0)):
    group = [item[1] for item in group]
    print 'Step:', key, 'Min:', min(group), 'Max:', max(group)

这段代码是把 time 按照 step 分组,然后找出每个组的最小值和最大值。你也可以尝试这样的写法:

step.reverse()
for key, group in groupby(time, lambda _: step.pop()):
    group = tuple(group)
    print 'Step:', key, 'Min:', min(group), 'Max:', max(group)

这样可以在不和 time 一起使用 zip 的情况下,直接按 step 分组。

撰写回答