Словарь: вычитание 1-й записи из 2-й в серии значений словаря - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть словарь, подобный этому, с тысячами ключей больше, чем показано, и сотнями значений для каждой буквы a, b, c:

dictex = {'cat': {'a': [[1, 3, 5], [2, 2, 7]], 'b': [[1, 3, 7], [2, 2, 7]], 'c': [[1, 2, 7], [2, 2, 7]]},
          'dog': {'a': [[1, 2, 5], [2, 2, 7]], 'b': [[1, 2, 7], [2, 2, 7]], 'c': [[1, 3, 7], [2, 2, 7]]},
          'moose': {'a': [[1, 1, 5], [2, 2, 7]], 'b': [[1, 1, 7], [2, 2, 7]], 'c': [[1, 1, 7], [2, 2, 7]]}}

Я хочу вычесть1-е значение из 2-го значения для каждой записи и сумма по всем a, всем b и всем c.Например, для записи cat в a используется операция (5-3) + (7-2).Предпочтительный вывод (.csv):

animal a   b   c
cat    7   9   10
dog    8   10  9
moose  9   11  11

Я могу получить конкретное животное и различие букв, используя

dictex['cat']['a'][0][2] - dictex['cat']['a'][0][1]`
output:
2

Я не уверен, как получить это для каждой записи вумный способ, который не требует много ручного ввода, а затем выведите его в форму выше.

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

Если вы можете использовать эту библиотеку, то можно просто написать pandas, если вы можете использовать эту библиотеку.

Обычно помещать списки в фреймы данных не очень хорошая идея, но мы выполняем лишь небольшую обработку и затем сохраняем результатв CSV-файл.

pd.DataFrame(dictex).rename_axis('animal', 1).applymap(lambda lists: sum(l[2]-l[1] for l in lists)).T.to_csv('f.csv')

В результате получается файл

animal,a,b,c
cat,7,9,10
dog,8,10,9
moose,9,11,11
0 голосов
/ 28 ноября 2018

Если вам придется делать определенные вычисления снова и снова, тогда, вероятно, лучше написать функцию.Вот функция, которая берет словарь, такой как dictex, имя животного и букву, и возвращает для вас индивидуальные вычисления:

# Do the calculations for a particular animal and letter
def calculate_value(mydict, animal, letter):
    W = mydict[animal][letter][0][2]
    X = mydict[animal][letter][0][1]
    Y = mydict[animal][letter][1][2]
    Z = mydict[animal][letter][1][1]

    # Do the math and convert the resulting number to a string,
    # which will save us some headaches when writing to the csv file.
    return str((W-X) + (Y-Z))

Вот функция, которая просматривает весь словарь, вычисляет значения для каждогоanimal и letter, а затем, наконец, возвращает результат в виде списка списков, который выглядит следующим образом: [ ['cat',7,9,10], ['dog',8,10,9], ... ] и т. д.

def make_new_list(my_dict):
    new_list = []
    for animal in my_dict:
        individual_animal_list = [animal]
        for letter in ['a', 'b', 'c']:
            individual_animal_list.append(calculate_value(my_dict, animal, letter))
        new_list.append(individual_animal_list)
    return new_list

Причина, по которой я использовал вышеуказанный формат, заключается в том, что он значительно облегчаетзаписать результат в CSV-файл.Просто возьмите каждый список, полученный из предыдущей функции, объедините все вместе с запятыми между ними и запишите его в виде строки в файле:

dictex = {'cat': {'a': [[1, 3, 5], [2, 2, 7]], 'b': [[1, 3, 7], [2, 2, 7]], 'c': [[1, 2, 7], [2, 2, 7]]},
          'dog': {'a': [[1, 2, 5], [2, 2, 7]], 'b': [[1, 2, 7], [2, 2, 7]], 'c': [[1, 3, 7], [2, 2, 7]]},
          'moose': {'a': [[1, 1, 5], [2, 2, 7]], 'b': [[1, 1, 7], [2, 2, 7]], 'c': [[1, 1, 7], [2, 2, 7]]}}

new_list = make_new_list(dictex)

with open('my_file.csv', 'w') as f:
    f.write('animal,a,b,c\n') # Write the header line
    for row in new_list:
        f.write(','.join(row))
        f.write('\n')

Имейте в виду, что словари в Python НЕ упорядочены.Таким образом, ваш результирующий файл не обязательно будет содержать строки с животными в том же порядке, в котором они отображаются в исходном словаре.

0 голосов
/ 28 ноября 2018

Вы можете определить отдельный метод, чтобы получить сумму всех различий между 2-м и 1-м элементами всех списков в списке, а затем сгенерировать result с "словарным пониманием":

def diff_sums(l):
    return sum(x[2] - x[1] for x in l)

dictex = {'cat': {'a': [[1, 3, 5], [2, 2, 7]], 'b': [[1, 3, 7], [2, 2, 7]], 'c': [[1, 2, 7], [2, 2, 7]]},
          'dog': {'a': [[1, 2, 5], [2, 2, 7]], 'b': [[1, 2, 7], [2, 2, 7]], 'c': [[1, 3, 7], [2, 2, 7]]},
          'moose': {'a': [[1, 1, 5], [2, 2, 7]], 'b': [[1, 1, 7], [2, 2, 7]], 'c': [[1, 1, 7], [2, 2, 7]]}}

result = {animal: {k: diff_sums(v) for k, v in num_lists.items()} for animal, num_lists in dictex.items()}
print(result)

Вывод

{'cat': {'a': 7, 'b': 9, 'c': 10}, 
 'dog': {'a': 8, 'b': 10, 'c': 9}, 
 'moose': {'a': 9, 'b': 11, 'c': 11}}

Чтобы записать это в файл CSV, вы можете использовать модуль csv:

import csv

columns = ['animal', 'a', 'b', 'c']
data = [[animal] + [v[c] for c in columns[1:]] for animal, v in result.items()]
with open('mydata.csv', 'w') as csvfile:
    writer = csv.writer(csvfile, delimiter=',')
    for line in [columns] + data:
        writer.writerow(line)

Выход

animal,a,b,c
cat,7,9,10
dog,8,10,9
moose,9,11,11
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...