как перебрать словарь как диапазон - PullRequest
0 голосов
/ 07 июля 2019

У меня есть словарь с ключом время начала видео и его значение как время окончания.каждая пара ключ-значение представляет отдельную группу.Как проверить, существует ли число в диапазоне.Например:

dictvid = {146: 209, 509: 539, 0: 145, 304: 320}

от 0 до 539 - от 210 до 303 и от 321 до 508 должно быть в другом словаре, т.е.

newgroup = {210:303,321:508}

Ответы [ 2 ]

1 голос
/ 07 июля 2019
from itertools import chain, groupby

dictvid = {146: 209, 509: 539, 0: 145, 304: 320}

i_from = 0
i_to = 539

out = dict()
s = sorted(set(range(i_from, i_to+1)).difference(chain.from_iterable(range(k, v+1) for k, v in dictvid.items())))
for _, g in groupby(enumerate(s), lambda v: v[0]-v[1]):
    l = [*g]
    out[l[0][1]] = l[-1][1]

print(out)

Отпечатки:

{210: 303, 321: 508}
1 голос
/ 07 июля 2019

Вы можете построить объект диапазона из каждой пары ключ-значение, что даст вам решение O (n) (O (n) для перебора словаря + O (1) для проверки in внутри каждого объекта диапазона ). Обратите внимание на + 1, так как объекты диапазона являются исключительными в конце).

print(any(208 in range(start, end + 1) for start, end in dictvid.items()))
print(any(211 in range(start, end + 1) for start, end in dictvid.items()))

Выходы

True
False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...