#python #arrays #average
#python #массивы #среднее
Вопрос:
У меня есть список, подобный следующему:
mylist = [('a', [(0,1), (1,2), (2,3)]),
('b', [(0,1), (1,2), (2,3)]),
('c', [(0,1), (1,2), (2,3)])]
которое я получил после различных операций в коде.
Возможно ли получить результат, подобный следующему?
newlist = [('a', [0.5, 1.5, 2.5]),
('b', [0.5, 1.5, 2.5]),
('c', [0.5, 1.5, 2.5])]
Входной список содержит содержимое в виде диапазонов, а выходной список генерируется путем вычисления среднего значения двух чисел из каждого диапазона. Спасибо.
Комментарии:
1. Ни один из двух фрагментов не является допустимым для Python.
2. Вы имеете в виду что-то вроде
(array['a'][i][0] array['a'][i][1]) / 2
? (не то чтобы это действительно действительный Python)
Ответ №1:
>>> l = [('a', [(0,1), (1,2), (2,3)]),
... ('b', [(0,1), (1,2), (2,3)]),
... ('c', [(0,1), (1,2), (2,3)])]
>>> newl = [(i[0], [(j[0] j[1])/2 for j in i[1]]) for i in l]
>>> newl
[('a', [0.5, 1.5, 2.5]), ('b', [0.5, 1.5, 2.5]), ('c', [0.5, 1.5, 2.5])]
Это работает в Python 3; в Python 2 вам нужно
>>> newl = [(i[0], [(j[0] j[1])/2.0 for j in i[1]]) for i in l]
Эти представления о списке эквивалентны следующему, более подробному коду:
>>> newl = []
>>> for i in l:
... temp = (i[0], [])
... for j in i[1]:
... temp[1].append((j[0] j[1])/2.0)
... newl.append(temp)
Комментарии:
1. @ Tim Привет, я попробовал приведенный выше код, но я получил ошибку как «TypeError: неподдерживаемый тип (ы) операнда для /: ‘str’ и ‘float'» Спасибо.
Ответ №2:
Понимание списков — это хорошо, но мой любимый метод Pythonic — это map()
, который применяет функцию к каждому элементу структуры:
ls = (('a', [(0,1), (1,2), (2,3)]),
('b', [(0,1), (1,2), (2,3)]),
('c', [(0,1), (1,2), (2,3)]))
for li in ls:
print(li[0], list(map(lambda x: sum(x)/len(x), li[1])))
Как говорит Тим, это работает для Python 3, для Python 2 вам понадобится float(len(x))
.
Ответ №3:
Для работы только с одним из ваших списков (допустимой частью python) вы могли бы использовать понимание списка:
numbers = [(0,1), (1,2), (2,3)]
print [sum(x) / float(len(x)) for x in numbers]
Это должно направить вас в правильном направлении и дает вам:
[0.5, 1.5, 2.5]