Как условно удалить ключи из нескольких словарей Python. Условие (Значение <= time.time () - 15) - PullRequest
1 голос
/ 05 апреля 2019

Как в Python 3.6 эффективно удалять определенные ключи из трех словарей в зависимости от того, является ли их значение 15-летним или старше?

В трех словарях целочисленные идентификаторы хранятся как ключи (1111 и т. Д.), А целые числа эпох - как значения (915824792 и т. Д.)

import time

dict1 = {1111: 915824792, 2222:1053632792, 1234:2211219992, ...}
dict2 = {1114: 1291837592, 9999:1580067992, 2317:2242496792, ...}
dict3 = {1777: 1229543192, 8888:1895687192, 2319:3725639192, ...}


[v for k,v in dict1.items() if v <= (time.time()-15)] # This is not complete, idk how to conditionally delete Keys from a dictionary, and idk if my syntax is correct

   [v for k,v in dict2.items() if v <= (time.time()-15)] # This is not complete, idk how to conditionally delete Keys from a dictionary, and idk if my syntax is correct

   [v for k,v in dict3.items() if v <= (time.time()-15)] # This is not complete, idk how to conditionally delete Keys from a dictionary, and idk if my syntax is correct

# https://stackoverflow.com/a/4181492/6200445

Ответы [ 2 ]

0 голосов
/ 06 апреля 2019

Вы можете использовать словарь, чтобы делать то, что вы хотите. Ваш текущий код примерно в 90% случаев:

threshold = time.time()-15  # helps performance to compute this only once
dict1 = {k: v for k, v in dict1.items() if v <= threshold}
dict2 = {k: v for k, v in dict2.items() if v <= threshold}
dict3 = {k: v for k, v in dict3.items() if v <= threshold}

Хотя это работает, это не особенно эффективно, так как нужно перебирать все значения во всех словарях. Если срок действия многих значений не истечет, возможно, вы захотите найти лучший способ. Одна идея состоит в том, чтобы поместить value, key, dictionary кортежей в кучу и удалять их до тех пор, пока наименьшее значение не превысит пороговое значение. Модуль heapq позволяет легко создавать кучи:

import heapq
from collections import counter

dict1 = {1111: 915824792, 2222:1053632792, 1234:2211219992}
dict2 = {1114: 1291837592, 9999:1580067992, 2317:2242496792}
dict3 = {1777: 1229543192, 8888:1895687192, 2319:3725639192}

heap = []
tie_breaker = counter()

for k, v in dict1.items():
    heapq.heappush(heap, (v, k, tie_breaker(), dict1))
for k, v in dict2.items():
    heapq.heappush(heap, (v, k, tie_breaker(), dict2))
for k, v in dict3.items():
    heapq.heappush(heap, (v, k, tie_breaker(), dict3))

threshold = time.time()-15
while heap[0][0] <= threshold:
    v, k, tb, dct = heapq.heappop(heap)
    del dct[k]

Обратите внимание, что если вы неоднократно выполняете этот срок действия, вам не нужно повторять циклы for, помещая все элементы в кучу, просто добавьте каждый новый элемент в кучу одновременно с тем, который вы добавляете в одну из них. словарей.

0 голосов
/ 06 апреля 2019

Вы можете попытаться построить новый диктат с пониманием:

dict1 = {1111: 915824792, 2222:1053632792, 1234:2211219992}
dict2 = {1114: 1291837592, 9999:1580067992, 2317:2242496792}
dict3 = {1777: 1229543192, 8888:1895687192, 2319:3725639192}

import time
now = time.time()
filter_v = now - 15
# 1554498239.9005954

new_dict1 = {
    k: v
    for k, v in dict1.items()
    if v <= filter_v}
# {1111: 915824792, 2222: 1053632792}

Повторите для каждого из диктов, если вы хотите, чтобы они разделились

new_dict2 = {
    k: v
    for k, v in dict2.items()
    if v <= filter_v}
new_dict3 = {
    k: v
    for k, v in dict3.items()
    if v <= filter_v}

Это то, что вам нужно?


Если у вас есть много диктов, которые вы хотите разделить, но отфильтровать несколько элементов в каждом, вы можете использовать список для хранения всех этих диктов:

import time
now = time.time()
filter_v = now - 15

dict_list = [
    {1111: 915824792, 2222:1053632792, 1234:2211219992},
    {1114: 1291837592, 9999:1580067992, 2317:2242496792},
    {1777: 1229543192, 8888:1895687192, 2319:3725639192},
]

# create new list with new dicts
new_dict_list = [
    {k: v
     for k, v in d.items()
     if v <= filter_v}
    for d in dict_list]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...