Лучший способ в Python объединить 2 списка и вернуть минимум / максимум набора - PullRequest
2 голосов
/ 15 сентября 2011

В настоящее время у меня есть два сет-листа, которые объединяют «шаги» и «время»:

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 и минимальное значение для шага 1, а также минимальное / максимальное для шага 2

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

как я могу сделать это в Python? мне нужно создать многомерный список? Есть ли функция, которая может перебирать пары ключ-значение в кортеже, который я могу просто использовать функцию zip?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 15 сентября 2011

Вы ищете 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, затем находит min и max для каждой группы.Кроме того, вы можете сделать что-то вроде:

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

Для группировки по step без zip пинга с time.

0 голосов
/ 15 сентября 2011

Как насчет этого подхода?

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