Вычесть значения в парах по два в отсортированном словаре - PullRequest
0 голосов
/ 23 июня 2019

Я все еще довольно плохо знаком с Python и пытаюсь автоматизировать то, что я делаю вручную.У меня есть отсортированный словарь из 6 предметов.Размер словаря всегда будет содержать 6 элементов, где ключ - это строка, а значение - это число с плавающей запятой.

Как только я заполнил свой словарь, я хочу вычесть значения из словаря в парах, то есть значение из 2-го элемента вычитает значение из первого элемента, значение из 4-го элемента вычитает значение из 3-го элемента и, наконец, значение из нашего последнегоЭлемент в словаре вычитает значение из нашего 5-го элемента.

Когда закончите, я распечатаю результаты.

Пример моего словаря:

my_dict = {}
my_dict = {'item1': '18.6798', 'item2': '12.638', 'item3': '20', \
     'item4': '60.00', 'item5': '65.7668', 'item6': '45.7668'}

Я искал понимание словаря в python, для циклов с вложенными if (не идеально), но не мог понять это.Любые указатели по-разному (более эффективные), которые позволили бы мне получить доступ к индексу значения в словаре?

    remainder = {}
        for key, value in sorted(my_dict.items()):
        ...
    print(remainder)

После того, как я вычислю разницу между значениями, я сохраню их вдругой словарь, к которому я могу получить доступ по ключу / значению.

Ответы [ 3 ]

1 голос
/ 23 июня 2019

Я изменил вас data, так что это dict с str до float.Для этого требуется Python 3.7>, в котором упорядочены dict s.

data = {
    'item1': 18.6798,
    'item2': 12.638,
    'item3': 20.0,
    'item4': 60.00,
    'item5': 65.7668,
    'item6': 45.7668,
}

Next process() - это функция, которая принимает data и (я думаю) выполняет то, что вы просили.Он работает напрямую с итераторами и не требует промежуточных list s или dicts (но, поскольку data настолько мал, это не проблема)

def process(data):
    items = iter(data.items())
    result = {}
    while True:
        try:
            key_1, value_1 = next(items)
        except StopIteration:
            break
        _, value_2 = next(items)
        result[key_1] = value_1 - value_2
    return result


print(process(data))
1 голос
/ 23 июня 2019

Вы можете застегнуть iter s из dict.items(), а затем использовать, чем в простом понимании словаря.Если у вас есть нечетное количество ключей, это будет игнорировать последнюю, поскольку нечего вычитать:

my_dict = {'item1': '18.6798', 'item2': '12.638', 'item3': '20','item4': '60.00', 'item5': '65.7668', 'item6': '45.7668'}

f = iter(sorted(my_dict.items()))
{k1:float(v1) - float(v2) for ((k1, v1), (k2, v2)) in zip(f,f)}

Результат:

{'item1': 6.0418, 'item3': -40.0, 'item5': 20.0}
1 голос
/ 23 июня 2019

ОК, сначала я делю их на пары, а затем для каждой пары вычисляю новое значение и вставляю remainder:

my_dict = {'item1': 18.6798, 'item2': 12.638, 'item3': 20, \
     'item4': 60.00, 'item5': 65.7668, 'item6': 45.7668}

items = list(sorted(my_dict.keys()))
pairs = [items[i:i + 2] for i in range(0, len(items), 2)]

remainder = {}
for item1, item2 in pairs:
    remainder[item1] = my_dict[item1] - my_dict[item2]

print(remainder)


...