Python中合并两个列表并返回集合的最小/最大值的最佳方法
我现在有两个列表,里面包含了“步骤”和“时间”的组合:
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
分组。