2014-10-09 2 views
0

Фон:Назначить фиксированное число переменных элементам в списке переменной длины

У меня есть скрипт python для проверки рабочего времени сотрудников. У каждого сотрудника есть утренняя и дневная смена, с обеденным перерывом между ними, и каждый раз, когда они кладут палец, записывается новая отметка времени.

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

Вопрос: «Как я могу« распаковать »временные метки для соответствующих переменных, избегая всего этого уродливого, дублированного кода?»

morning_entry = None 
morning_leave = None 
afternoon_entry = None 
afternoon_leave = None 

timestamps = get_timestamps() 

if timestamps: 
    morning_entry = timestamps.pop(0) 

if timestamps: 
    morning_leave = timestamps.pop(0) 

if timestamps: 
    afternoon_entry = timestamps.pop(0) 

if timestamps: 
    afternoon_leave = timestamps.pop(0) 
+0

'pop()' удаляет последний элемент из списка. Не очевидный выбор дизайна imo. – vaultah

+0

@PadraicCunningham: но 'timestamps.pop()' мутирует 'timestamps'. – DSM

+0

@PadraicCunningham: как указывал DSM, я снимаю один элемент за раз и назначая его. Это работает так, как я хочу, но, очевидно, очень уродлив и плохо нарушает DRY (представьте более длинный список переменных ...) – heltonbiker

ответ

1

Простое решение, но не может быть, что элегантным

morning_entry,morning_leave,afternoon_entry,afternoon_leave=(timestamps+[None]*4)[:4] 

Просто раздувание с Nones перед списком, а затем нарезать

+0

Я фактически использовал '= timestamps + [None] * (4-len (timestamps))', но это личное предпочтение. Любой подход работает! Благодаря! – heltonbiker

+0

(также обратите внимание, что мой фактический код должен использовать 'pop (0)', который я забыл ввести в первый раз, когда я написал вопрос, но теперь это исправлено. Это важно, потому что в противном случае я получаю неправильный порядок) – heltonbiker

+1

Ah !! на самом деле я думал, что, набрав свой ответ, но потом увидел, что он выталкивает его с обратной стороны, я изменил переменный порядок –

0

itertools основанной версии Sainath's answer:

from itertools import chain, repeat 

(morning_entry, 
morning_leave, 
afternoon_entry, 
afternoon_leave) = chain(timestamps, repeat(None, 4)) 

Является ли это более элегантным спорным; он имеет незначительное улучшение, которое timestamps не ограничено каким-либо конкретным типом итерации.

Смежные вопросы