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