2015-04-29 4 views
-1

У меня есть defalutdict(set), который хранит набор пользователей, а для каждого пользователя - набор событий и временную метку для каждого события. Мне нужно проверить метку времени элемента в defaultdict, и если она выходит за пределы определенного времени, то удалите ее из dict.Python: Сравнение значений в defaultdict (set)

defaultdict [игрок] выглядит следующим образом:

set([('event1', <function timestampToEpoch at 0x102f8b758>), 
    ('event3', <function timestampToEpoch at 0x102f8b758>), 
    ('event2', <function timestampToEpoch at 0x102f8b758>)])) 

Код я пытаюсь использовать как выглядит:

def removeUnique(player, f_Type, num_seconds, ts): 
    curTime = timestampToEpoch(ts) 
    for e in uniqueFishes[player] if e <= curTime - num_seconds 
      uniqueFishes[player].remove(e) 
    print uniqueFishes[player] 
+0

В чем проблема с кодом? Есть ли стек? – RafaelC

+0

я получаю 'File "fiveMinIntervCnSnC.py", строка 73 для е в uniqueFishes [Player], если е> = (CURTIME - NUM_SECONDS) ^ SyntaxError: недопустимый syntax' – Mike

+0

Тупой опечатка редактировать - Я на самом деле хочу, чтобы удалить предметы, (не новее), поэтому я изменил 'для e в uniqueFishes [player], если e> = curTime - num_seconds' для' for e в uniqueFishes [player], если e <= curTime - num_seconds' – Mike

ответ

1

Поместите если функцию в цикле.

Переменная не является временной меткой, а кортежем строки и временной метки. Вы получаете отметку времени с выбором второго элемента кортежа: e[1].

Вы изменяете итерируемый (uniqueFishes), итерации по нему. Это всегда плохая идея. Самое простое (но не самое эффективное) решение для этого - перебирать КОПИЮ исходного набора при изменении самого набора.

def removeUnique(player,f_Type,num_seconds,ts): 
    curTime = timestampToEpoch(ts) 
    for e in uniqueFishes[player].copy(): 
     if e[1] >= curTime - num_seconds: 
     uniqueFishes[player].remove(e) 
    print uniqueFishes[player] 
+0

Это определенно сработало (или у меня было достаточно близко, чтобы выяснить мои следующая небольшая ошибка) - спасибо! – Mike

1

Как вы упомянули две ошибки:

1) строка 73 для e в uniqueFishes [player], если e> = (curTime - num_seconds)^СинтаксисError: недействительный синтаксис

2) Установленный измененный размер во время итерации

.

изменение

for e in uniqueFishes[player] if e >= curTime - num_seconds 
     uniqueFishes[player].remove(e) 

к:

to_remove_set = set() 
for e in uniqueFishes[player]: 
    if e[1] >= (curTime - num_seconds): 
     to_remove_set.add(e) 

# modify your set after iteration. 
uniqueFisihes[player] -= to_remove_set 
+0

См. выше, но я получаю это 'Я в конечном итоге получаю RuntimeError: установите измененный размер во время итерации', который я предполагаю, потому что он удаляет объект из defaultdict, поскольку он проходит через него. – Mike

+1

@Mike вы можете добавить удаляемые элементы во временный набор, называть его to_remove_set, uniqueFishes [player] = uniqueFishes [player] - to_remove_set обновит ваш набор, вы должны сделать вычитание после итерации цикла for. – haifzhan

0

Используйте список понимание:

[uniqueFishes[player].remove(e) for e in uniqueFishes[player] 
if e >= (curTime - num_seconds)] 
+0

В итоге я получаю 'RuntimeError: установите измененный размер во время итерации' – Mike

+2

Зачем использовать понимание списка, если вы не создаете список? – DSM

+0

Правильно, он не будет работать для набора. Конечно, понимание списка намного быстрее, чем для циклов. Вопрос: Зачем использовать набор вместо списка в этом примере. Почему данные дублируются и, следовательно, нуждаются в наборе? – Alexander

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