2014-02-07 4 views
2

Я ноб на Python, исходя из C/C++. Я работаю с акселерометром, подключенным к Beaglebone Black. Я собираю 6 [X, Y, Z] показания акселерометра, как:Python 2.7 найти мин, макс в списке списков

calib = [[-72, -80, -673], [-31, -1673, 481], [-29, -62, 1564], [-148, 1464, 545], [-1513, -67, 539], [1350, -80, 480]] 

Мне нужно найти минимум и максимум для X, Y и Z из этого набора из шести измерений. код у меня есть:

max = [0] * 3 
min = [0] * 3 

for ndx, sample in enumerate(calib): 
    x, y, z = calib[ndx] 
    if x > max[0]: 
     max[0] = x 
    if x < min[0]: 
     min[0] = x 
    if y > max[1]: 
     max[1] = y 
    if y < min[1]: 
     min[1] = y 
    if z > max[2]: 
     max[2] = z 
    if z < min[2]: 
     min[2] = z 

print "min", min 
min [-1513, -1673, -623] 

print "max", max 
max [1350, 1464, 1564] 

Это, кажется, работает, но только не выглядит «вещий». Должен быть более чистый способ сделать это. Любой совет?

+0

Вы можете просто отсортировать измерения и перенести первые 3, например: 'listOfNumbers.sort() [: 3]'. Вы можете получить последние три элемента списка с помощью 'someList [-3:]'. Но я бы рекомендовал использовать 'numpy' для скорости, если вы имеете дело с числами. –

+0

@AleksanderLidtke, который не решает независимые задачи x, y и z. – mhlester

+0

Для сортировки по 3 критериям необходимо иметь собственный критерий. –

ответ

13

Во-первых, переназначить список, чтобы дать вам список x, y и z списков:

xyz = zip(*calib) 

затем сопоставьте мин и макс в список:

>>> map(min, xyz) 
[-1513, -1673, -673] 

>>> map(max, xyz) 
[1350, 1464, 1564] 

В качестве альтернативы как одно из следующих понятий:

>>> [(min(a), max(a)) for a in zip(*calib)] 
[(-1513, 1350), (-1673, 1464), (-673, 1564)] 
+1

Я бы проголосовал за тебя за идею о понимании списка, если бы это позволило мне. Благодарю. – RayZ

Смежные вопросы