Я хочу найти час дня с max ru sh в офисе - PullRequest
2 голосов
/ 02 марта 2020

У меня есть список a = [(1,3),(3,7),(1,10),(3,5),......] И так далее. т.е. (entry_time, exit_time).

Где 1-й элемент в каждом кортеже - это время входа сотрудника, а 2-й элемент - время выхода. нужно найти время, как в какое время суток в офисе было максимум людей.

Например, вывод:

{1'00: 10, 2'00: 20, 3'00: 15}

Таким образом, конечный результат должен быть 2'00 со счетом 20.

Ответы [ 3 ]

5 голосов
/ 02 марта 2020

Используйте понимание списка с помощью flatten и range, затем используйте collections.Counter и последний максимум извлечения:

a = [(1, 3), (3, 7), (1, 10), (3, 5)]

from collections import Counter

d = Counter([f'{y}:00' for s, e in a for y in range(s, e + 1)])
print(d)
Counter({'3:00': 4, '4:00': 3, '5:00': 3, '1:00': 2, '2:00': 2,
     '6:00': 2, '7:00': 2, '8:00': 1, '9:00': 1, '10:00': 1})

maximum = max(d, key=d.get)
print(maximum, d[maximum])

3:00 4

Если последнее значение кортежа не считается:

d = Counter([f'{y}:00' for s, e in a for y in range(s, e)])
print (d)
Counter({'3:00': 3, '4:00': 3, '1:00': 2, '2:00': 2,
         '5:00': 2, '6:00': 2, '7:00': 1, '8:00': 1, '9:00': 1})

maximum = max(d, key=d.get)
print(maximum, d[maximum])
3:00 3
1 голос
/ 02 марта 2020

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

a = [(1, 3), (3, 7), (1, 10), (3, 5)]
#  Initiate list for hours the represent the counter
rush_hour_status = [0] * 24
# Iterate over the day hours 12/24, doesn't matter.
for hour in range(24):
    for person in a:
        if person[0] <= hour and person[1] > hour:  # Check if this person is working in this hour
            rush_hour_status[hour] += 1

max_rush = max(rush_hour_status)
max_rush_index = (rush_hour_status.index(max_rush))
print(max_rush_index, max_rush)
0 голосов
/ 02 марта 2020

Вот код со сложностью O (n), который печатает список часов пик

Предположение: время вводится в формате 24 часа

a = [(10,15),(11,18),(10,11),(13,15)]
time_table = {}

for x in range(0,24):
    time_table[x]=0

for i in a:
    time_table[i[0]] = time_table[i[0]]+1
    time_table[i[1]] = time_table[i[1]]-1
    print(time_table[i[0]], time_table[i[1]])

for x in range(1,24):
    time_table[x]=time_table[x-1]+time_table[x]

print(time_table)

max_value = max(time_table.values())

def getKeysByValue(dictOfElements, valueToFind):
    listOfKeys = list()
    listOfItems = dictOfElements.items()
    for item  in listOfItems:
        if item[1] == valueToFind:
            listOfKeys.append(item[0])
    return  listOfKeys

listOfKeys = getKeysByValue(time_table, max_value)
print(max_value, listOfKeys)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...