【问题标题】:specific implementation of dictionary字典的具体实现
【发布时间】:2012-08-06 13:07:35
【问题描述】:

我不知道标题是否恰当,但目前这是我的问题:

我在文本文件(有 2 列)中有以下格式的条目:

Name     Time  

Santa    1.2
Jim      2.5
Santa    2.7
Santa    2.9

我应该形成一个字典,其中名称为键,(时间,计数)为值。在上述名称中,圣诞老人重复了 3 次,连续出现的时间差小于 2 秒。因此,与该条目关联的 Count 值为 3。如果发生这种情况,则应从字典中删除该条目。否则,计数值应为零(如果圣诞老人的 2 次出现相隔 2 秒,而第 3 次出现在 2 秒后,则该条目的计数将重新初始化为零)。

可以这样实现:将 (Time, Count) 作为列表并将该列表作为键的值?我是Python新手,如有错误请见谅。

伪代码是这样的:

Read line in the file:   
    if Santa is in dictionary:    
        time_difference = time from column 2 of the line - dictionary[Santa]  
        if(time_difference < 2):  
            Replace the old occurance with new one along with time  
            # If the previous count value associated with Santa = 1, add 1 to make it 2  
            Make the Count associated with Santa = count+1    
            if(count associated with Santa = 3):  
                delete the Santa entry    
        else:  
            Make count associated with Santa = 1      
    else:  
        Add Santa to dictionary along with its time and make associated count = 1

【问题讨论】:

  • 哦,这有点令人困惑。据我所知,字典中剩余的 all 条目的count 值将为零,那么为什么要首先存储它呢? time 值应该在最终字典中吗?
  • 因为如果一个条目出现了 3 次且每次相隔不到 2 秒,则该条目将被删除。正是出于这个特殊目的,Time 用于比较同一条目的先前发生的实例。例如,如果一个条目的计数值为 2,并且在第二次出现 2 秒后发生了第三次,则删除该条目
  • 退后一步,写一些明确的需求,甚至可能使用伪代码,以及您想要的示例案例。我很困惑,即使我能在一段时间后破译你想要的东西,但如果你能改进这个问题,对每个人来说都会更容易。谢谢:)
  • 好的...我要编辑问题...
  • 只是为了澄清。你想要一个名字列表。 ["santa","jim"] 并且您希望该列表仅包含满足以下要求的条目:该条目不得有 3 个动作,且彼此在 2 秒内?

标签: python python-3.x python-2.7


【解决方案1】:

编辑:我刚刚注意到您想在 2 秒不活动后重新启动计数计时器,我将在稍后发布该修复程序。

EDIT2:好的,我添加了。应该不错!

不是最干净的代码,但它可以完成工作。

class dictholder():
    def __init__(self):
        self.dict = {}

    def add(self, name, time):
        if name in self.dict:
            if (abs(time) - abs(self.dict[name][0]) < 2):
                self.dict[name][1] += 1
                self.dict[name][0] = time
                if self.dict[name][1] == 3:
                    del self.dict[name]
        else:
            self.dict[name] = [time, 1]
        for item in self.dict:
            if (abs(time) - abs(self.dict[item][0]) > 2):
                self.dict[item][1] = 1

    def get(self):
        return self.dict

示例:

d = dictholder()
d.add("Santa", 1.2)
d.add("Jim", 2.5)
d.add("Santa", 2.7)
d.add("Santa", 2.9)

print d.get()

>>> 
{'Jim': [2.5, 1]}
>>> 

【讨论】:

  • 好的,再次测试,一切正常。请告诉我您是否还想要其他东西 - 如果有人有能力改进此代码(我知道它可以使用很多效率改进和列表理解),请一如既往地随意。
  • @Inbar...代码中的一个小问题...如果名称重复(如此处的圣诞老人),字典将显示圣诞老人的第一次条目...例如在最后一行,如果是 d.add("Santa", 3.2) 而不是 d.add("Santa", 2.9),那么字典应该包含最新的值,{'Jim': [2.5, 1], ' Santa': [3.2, 2]},但如果我执行这段代码,我会得到 {'Jim': [2.5, 1], 'Santa': [1.2, 2]}。即圣诞老人第一次出现
  • 这段代码假设每次你访问它时,(用.add添加一些新的东西)“时间”值正在增加。我的印象是time 实际上指的是时间,而不仅仅是你自己生成的东西。另外,从您的 OP 中,您没有指定最新条目很重要。无论如何,这是一个简单的修复,我会稍后更新答案。
  • has_key 已弃用,请使用 in
  • @skyl 是的,我知道这一点,但是很好,总的来说,我写这段代码并不复杂;因为 OP 声明它们是 python 新手。但是,如果您想改进答案或使代码更高效,那就去吧!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
  • 2017-06-26
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多