Python:比较defaultdict(集合)中的值

Python:比较defaultdict(集合)中的值,python,Python,我有一个defalutdict(set),它存储一组用户,每个用户有一组事件,每个事件有一个时间戳。我需要做的是检查defaultdict中项目的时间戳,如果它在特定时间之外,则将其从dict中删除 defaultdict[player]如下所示: set([('event1', <function timestampToEpoch at 0x102f8b758>), ('event3', <function timestampToEpoch at 0x102f8b

我有一个
defalutdict(set)
,它存储一组用户,每个用户有一组事件,每个事件有一个时间戳。我需要做的是检查defaultdict中项目的时间戳,如果它在特定时间之外,则将其从dict中删除

defaultdict[player]如下所示:

set([('event1', <function timestampToEpoch at 0x102f8b758>), 
     ('event3', <function timestampToEpoch at 0x102f8b758>),
     ('event2', <function timestampToEpoch at 0x102f8b758>)]))
set([('event1',),
(‘事件3’,),
('event2',)])
我尝试使用的代码如下所示:

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]
def removeUnique(播放器、f_类型、秒数、ts):
curTime=timestampToEpoch(ts)

对于uniqueFishes[player]中的e,如果e,正如您提到的两个错误:

1) 如果e>=(curTime-num_seconds)^语法错误:无效语法

2) 在迭代过程中设置更改的大小

改变

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


使用列表理解:

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

将if函数放入循环中

e
变量不是时间戳,而是字符串和时间戳的元组。选择元组的第二项即可获得时间戳:
e[1]

您可以在迭代iterable(
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]

你的代码有什么问题?有stacktrace吗?如果e>=(curTime-num_seconds)^SyntaxError:invalid语法` Dumb typo edit-我实际上想删除较旧(而不是较新)的项目,所以我更改了uniqueFishes中e的
[player]如果e>=curTime-num_seconds
在uniqueFishes[player]中表示e如果EI最终得到
运行时错误:在迭代过程中设置更改的大小
如果您不构建列表,为什么要使用列表理解?正确,它对集合不起作用。当然,列表理解比循环快得多。问题:为什么在本例中使用集合而不是列表。为什么数据会重复,因此需要se是的-因此有多个“玩家”,因此有多个实例需要保持
uniqueFishes[player1]
uniqueFishes[player2]的跟踪
etcSee,但是我得到了这个
我最终得到了RuntimeError:Set changed size in iteration
,我假设这是因为它在执行过程中从defaultdict中删除了一个对象it@Mike您可以将要删除的元素添加到一个临时集合中,将其调用为_remove_set,uniqueFishes[player]=uniqueFishes[player]-若要删除,集合将更新集合,您应该在for循环迭代后执行减法。这确实有效(或者让我足够接近以找出我的下一个小错误)-谢谢!
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]