поиск минимальных значений по индексу каждого элемента в списке объектов

#python

#python

Вопрос:

У меня есть экземпляры этого объекта ниже, у которого есть список pid и pos, элементы которого могут варьироваться от 3-10, я пока буду использовать три элемента.

 lst = []

class Ppl:
    def __init__(self, pid):
        # local variables
        self.pid = pid
        self.pos = [3*pid 6, 1, 10 pid-4*pid] 

for index in range(3):        
    lst.append(Ppl(index))

for index in range(len(lst)):
    print(lst[index].pos)
  

что приводит:

 [6, 1, 10]
[9, 1, 7]
[12, 1, 4]
  

Мне нужен способ получить минимальные значения этих трех по каждому индексу и составить список так, чтобы ожидаемый результат был:

 [6, 1, 4]
  

Что я пробовал до сих пор:

Я пробовал этот способ, который на самом деле не является хорошим подходом, потому что он будет работать, только если объектов списка и элементов списка ‘pos’ всего три.

 lst2 = []
for index in range(len(lst)):   
    rst = min(lst[0].pos[index],lst[1].pos[index],lst[2].pos[index])
    lst2.append(rst)
print(lst2) 
>> [6, 1, 4]
  

Другой подход, который работает только в том случае, если список не содержит экземпляров объектов… но это не так, как я хочу.

 lst3 = [[6, 1, 10], [9, 1, 7], [12, 1, 4]]  

lst3 = list(map(min, *lst3))
print(lst3)
>> [6, 1, 4]
  

Итак, как это сделать?

Комментарии:

1. Вам нужно объединить ваш первый фрагмент кода, который создает некоторые списки, с вашим последним, который принимает некоторые списки и дает вам то, что вы хотите. — И, да, я намеренно пропустил ключевой термин, о котором вам нужно знать, чтобы решить эту проблему.

Ответ №1:

вы могли бы это сделать:

 lst[]
n = 5
for index in range(n):        
    lst.append(Ppl(index))

result = list(map(min, *[x.pos for x in lst]))
  

Ответ №2:

Вот способ обработки существующего списка списков, как вы показываете, где каждый список может быть любой длины, если все внутренние списки имеют одинаковую длину:

 from functools import reduce

data =  [[6, 1, 10],
        [9, 1, 7],
        [12, 1, 4]]

mins = []

len = len(data[0])
for i in range(len):
    mins.append(reduce((lambda x, y: [min(x[i], y[i])] * len), data)[0])

print mins
  

Результат:

 [6, 1, 4]
  

Комментарии:

1. Я не был уверен, хочет ли OP работать со своими объектами Ppl или с необработанными данными. Кажется, он добавил еще один фрагмент кода, показывающий, что он пробовал, который был а) лучше, чем у меня ( lst3 = list(map(min, *lst3)) ), и сказал, что это не то, что он хочет. Поэтому я не вижу, чтобы мой ответ был здесь очень ценным. Но он получил одобрение. Я не беспокоюсь о точках. Может быть, мне следует удалить его? — его ответ тоже кое-чему научил меня. Я новичок в функциональном программировании.

Ответ №3:

Вы могли бы просто найти количество элементов в массиве только первого экземпляра класса (каждый экземпляр должен иметь одинаковое количество элементов в массиве позиций)

 lst2 = []

numOfObjects = len(lst) #number of instances of the class 'Ppl'

numElements = len(lst[0].pos) #number of elements in array of EACH class instance

for index in range(numElements):

    rst = min([lst[i].pos[index] for i in range(numOfObjects)])
    lst2.append(rst)

print (lst2)
  

Ответ №4:

Вы можете использовать следующий код

 import  numpy as np

lst = []

class Ppl:
    def __init__(self, pid):
        # local variables
        self.pid = pid
        self.pos = [3*pid 6, 1, 10 pid-4*pid]

for index in range(3):
    lst.append(Ppl(index))
a=[]
for index in range(len(lst)):
    # print(lst[index].pos)
    a.append(lst[index].pos)

print(np.min(a,axis=0))