#python #dictionary
#python #словарь
Вопрос:
У меня есть словарь, подобный этому:
dict_test ={1: 111, 2: 2222, 3:333, 4:4444, 5:5555, 6:6666,
7: 777, 8: 8888, 9:9999, 10:100010101}
и хотел бы создать подмножество словаря, которое принимает предыдущие четыре значения с учетом ключа 8, например. Таким образом, результирующий ожидаемый словарь будет выглядеть следующим образом:
dict_new ={4:4444, 5:5555, 6:6666, 7: 777, 8: 8888}
Я попытался написать более общую функцию ниже, где я могу в более общем плане определить, сколько предыдущих значений я должен просмотреть.
def get_x_prev_entries(dictionary: dict, key: str, prev: int):
if key in dictionary:
token = object()
keys = [token]*(prev*-1) sorted(dictionary) [token]*diff
print('keys' str(keys))
new_dict = []
newkeys = []
new_prev= prev
# extract all keys that are between 0 and the specified difference
while new_prev is not 0:
new_prev -= 1
if len(newkeys) == 0:
newkeys= newkeys
else:
newkeys = newkeys.append(keys[keys.index(key)-new_diff])
print(newkeys)
print(new_diff)
new_dict = {k:v for k, v in dictionary.items() if k in newkeys}
return new_dict
else:
print('Key not found')
Итак, чтобы создать желаемый словарь, я бы в идеале ввел
get_x_prev_entries(dict_test, 8, 4)
но на данный момент я получаю только возвращенный пустой словарь. Любой совет был бы оценен. Спасибо!
Ответ №1:
Использование order dict
from collections import OrderedDict as od
dict_test ={1: 111, 2: 2222, 3:333, 4:4444, 5:5555, 6:6666, 7: 777, 8: 8888, 9:9999, 10:100010101}
od_dict = od(dict_test)
def get_previous_keys(od_dict, prev=4, given=8):
if given not in od_dict:
return
k, v = [], []
for i in range(given-prev, given):
k.append(i)
v.append(od_dict[i])
return dict(zip(k,v))
print(get_previous_keys(od_dict))
{4: 4444, 5: 5555, 6: 6666, 7: 777}