Добавление значений в список Python между двумя словарями - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть список целых чисел.В этом списке есть два словаря, например, так:

value_list = [1180, 1190, 1190, {'low': 1180}, 1130, 1130, 1180, {'low':1160}, 1130]

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

for item in value_list:
     # if item in list is a dict, sum its value
     # with value of next dict and values in between

В этом случае вывод будет 5780

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

value_list[3]['low'] + sum(value_list[4:7]) + value_list[7]['low']

Но это кажется слишком запутанным

Ответы [ 6 ]

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

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

total_sum = 0
dicts_num = 0 #flag for checking how many dicts have appeared  
for value in value_list:
    if isinstance(value, dict):
        dicts_num += 1
        total_sum += value["low"]
    elif (dicts_num == 1):
        total_sum += value
0 голосов
/ 13 ноября 2018

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

def int_or_value(item, key='low'):
    if isinstance(item, int):
        return item
    else:
        return item[key]

value_list = [1180, 1190, 1190, {'low': 1180}, 1130, 1130, 1180, {'low':1160}, 1130]
indices = [index for index, value in enumerate(value_list) if isinstance(value, dict)]

# Use this if you have multiple instances of {dict} ... {dict} to sum in you value_list
for start, stop in (indices[n:n+2] for n in range(0, len(indices), 2)):
    print(sum(int_or_value(item) for item in value_list[start:stop+1]))

# If you are sure there is going to be a single instance of {dict} ... {dict} to sum just access indices directly
print(sum(int_or_value(item) fro item in value_list[indices[0]:indices[1]+1]))
0 голосов
/ 13 ноября 2018

Быстрое и ленивое решение, хотя я уверен, что поймаю немного зря, чтобы не ловить и обрабатывать исключения должным образом

fl = 0
s = 0
for i in value_list:
    if fl == 0:
        if type(i) == dict:
             s += i['low']
             fl = 1
             continue
    if fl == 1:
        try:
            s += i
        except:
            s += i['low']
            fl = 0
0 голосов
/ 13 ноября 2018

если у вас есть индексы (индексы?) Объектов dict, вы можете использовать их в понимании списка:

sum([x if type(x)==int else x['low'] for x in value_list[3:8]])

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

Предполагая, что в первом и последнем диктантах есть только числовые значения в value_list:

value_list = [1180, 1190, 1190, {'low': 1180}, 1130, 1130, 1180, {'low':1160}, 1130]
dicts = [(i, list(d.values())[0]) for i, d in enumerate(value_list) if isinstance(d, dict)]
sum(value_list[dicts[0][0] + 1 : dicts[-1][0]]) + sum(t[-1] for t in dicts)
# Outputs: 5780

Если предположение неверно, оно должно быть более сложным.

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

Вы можете использовать цикл с переменной флага

found_dict = False
total = 0
for i in value_list:
    if found_dict:
        if type(i) is dict:
            total += i['low']
            break
        else:
            total += i
    elif type(i) is dict:
        total += i['low']
        found_dict = True
...