среднее значение для содержимого списка

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