Python比较具有相似和精确键的词典

时间:2014-10-08 07:28:10

标签: python dictionary

我有一个场景,可以根据键组比较两个词典。 即

TmpDict ={}
TmpDict2={}
for line in reader:
    line = line.strip()
    TmpArr=line.split('|')
    TmpDict[TmpArr[2],TmpArr[3],TmpArr[11],TmpArr[12],TmpArr[13],TmpArr[14]]=line
for line in reader2:
    line = line.strip()
    TmpArr=line.split('|')
    TmpDict2[TmpArr[2],TmpArr[3],TmpArr[11],TmpArr[12],TmpArr[13],TmpArr[14]]=line

这可以很好地比较具有完全相同键的两个词典但是有一个容差,我需要考虑。那就是.. TmpArr [12],TmpArr [14]是需要检查公差的时间和持续时间。请参阅以下示例

示例:

dict1={(111,12,23,12:22:30,12:23:34,64):     4|1994773966623|773966623|754146741|\N|359074037474030|413025600032728|}
dict2={(111,12,23,12:22:34,12:23:34,60) :4|1994773966623|773966623|754146741|\N|359074037474030|413025600032728|} 

假设我有两个长度为1的词典,公差为“4”秒,因此即使4秒的时间和持续时间存在差异,上述键也必须被视为匹配行。 我知道字典搜索密钥是o(1)而不管长度如何,我怎样才能以相同的性能实现这种情况。 谢谢

2 个答案:

答案 0 :(得分:1)

您至少有以下4个选项:

  1. 将所有键存储在容差范围内(消耗内存)。

  2. 查找带宽度的键。请注意,如果公差是定义的并且是常数,那么 查询为C * O(N),即O(n)

  3. 结合以前的方法:使用某种方案压缩密钥,比如向下舍入到可整除为4,最多可被4整除,然后将这些密钥的值存储在字典中,并从精确验证值是否正确。

  4. 或者不使用字典而是使用某种树形结构;请注意,您仍然可以将密钥的确切部分存储在字典中。

  5. 因此,您没有提供足够的信息来决定最好的信息。不过我个人会去3。

答案 1 :(得分:0)

如果您可以使用更多内存来保持上述代码的性能,则可以为每个元素插入多个条目。例如" 111,12,23,12:22:30,12:23:34,60"," 111,12,23,12:22:30,12:23:34 ,61"," ...," 111,12,23,12:22:30,12:23:34,68"只插入"" 111,12,23,12:22:30,12:23:34,64"键。 如果你不想浪费内存但o(1)保持性能,你可以检查一个键的8个键(4​​个键和4个键)。它比上面的代码多8倍,但也是o(1)。