Средние дублированные значения из двух парных списков в Python

в моем коде я получаю два разных списка из разных источников, но я знаю, что они находятся в одном порядке. Первый список («имена») содержит список строк ключей, а второй («result_values») – это серия поплавков. Мне нужно сделать пару уникальной, но я не могу использовать словарь, поскольку будет сохранено только последнее введенное значение: вместо этого мне нужно сделать среднее (среднее арифметическое) значений, имеющих дубликат ключа.

Пример желаемых результатов:

names = ["pears", "apples", "pears", "bananas", "pears"] result_values = [2, 1, 4, 8, 6] # ints here but it's the same conceptually combined_result = average_duplicates(names, result_values) print combined_result {"pears": 4, "apples": 1, "bananas": 8} 

Мои единственные идеи связаны с несколькими итерациями и до сих пор были уродливыми … есть ли элегантное решение этой проблемы?

5 Solutions collect form web for “Средние дублированные значения из двух парных списков в Python”

Я бы использовал словарь в любом случае

 averages = {} counts = {} for name, value in zip(names, result_values): if name in averages: averages[name] += value counts[name] += 1 else: averages[name] = value counts[name] = 1 for name in averages: averages[name] = averages[name]/float(counts[name]) 

Если вы заинтересованы в больших списках, я бы заменил zip на izip из itertools.

 from collections import defaultdict def averages(names, values): # Group the items by name. value_lists = defaultdict(list) for name, value in zip(names, values): value_lists[name].append(value) # Take the average of each list. result = {} for name, values in value_lists.iteritems(): result[name] = sum(values) / float(len(values)) return result names = ["pears", "apples", "pears", "bananas", "pears"] result_values = [2, 1, 4, 8, 6] print averages(names, result_values) 

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

 from collections import defaultdict averages = defaultdict(float) count = defaultdict(int) for name,result in zip(names,result_values): count[name] += 1 averages[name] += (result - averages[name]) / count[name] 

Я думаю, что вы ищете itertools.groupby :

 import itertools def average_duplicates(names, values): pairs = sorted(zip(names, values)) result = {} for key, group in itertools.groupby(pairs, key=lambda p: p[0]): group_values = [value for (_, value) in group] result[key] = sum(group_values) / len(group_values) return result 

См. Также zip и sorted .

 >>> def avg_list(keys, values): ... def avg(series): ... return sum(series) / len(series) ... from collections import defaultdict ... d = defaultdict(list) ... for k, v in zip(keys, values): ... d[k].append(v) ... return dict((k, avg(v)) for k, v in d.iteritems()) ... >>> if __name__ == '__main__': ... names = ["pears", "apples", "pears", "bananas", "pears"] ... result_values = [2, 1, 4, 8, 6] ... print avg_list(names, result_values) ... {'apples': 1, 'pears': 4, 'bananas': 8} 

У вас может быть avg() return float(len(series)) если вы хотите иметь средние значения с плавающей запятой.

  • Доступ к элементу в списке списков
  • Две переменные с одним и тем же списком имеют разные идентификаторы ... почему?
  • Преобразование списка в строку с помощью python
  • Преобразование столбца dataframe в список списков и преобразование обратно в dataframe, при сохранении идентификационной ассоциации
  • Что происходит в бесконечных вложенных списках?
  • Python 2.7, создающий многомерный список
  • Создание списка в Python с несколькими копиями данного объекта в одной строке
  • Как разбить список и передать их как отдельный параметр?
  • Создайте пустой список в python с определенным размером
  • Сумма из нескольких списков индексов
  • Создание списка списков без refrences в python
  • Python - лучший язык программирования в мире.