存储具有非唯一键值对的大型字典

时间:2015-02-13 21:04:08

标签: python python-3.x dictionary

我有一个大的(超过一百万个字符)这种形状的文本文件:

'abc' 2
'nmb' 3
'sds' 5
'abc' 6

如您所见,每一行都有两个元素。每行上的对不是唯一的,这意味着' abc'可以映射到2和3,可能还有更多。我需要将它存储到一个合适的数据结构中,我可以保存到文件中。稍后我想看看例如字符串出现了多少次以及它被映射到某个数字的次数。我需要能够相对快速地完成这项工作,否则我可以按原样使用该文件。

我首先尝试使用json库创建字典并存储数据,这非常简单易行。但后来我意识到我不能使用它,因为键值对不是唯一的,键可以映射到几个值,数据结构应该保留它。

因此,考虑到文件的大小和我想要使用它的方式,有什么好办法呢?

3 个答案:

答案 0 :(得分:3)

dict list的{​​{1}}怎么样?:

{ 
    'abc': [2, 6],
    'nmb': [3],
    'sds': [5]
}

在进一步了解OP的用例后进行编辑:您也可以这样做:

{
    'abc': {2: 3, 6: 7},
    'nmb': {3: 1},
    'sds': {5: 1},
}

您还可以使用其他答案中提到的defaultdictcollections.Counter来快速完成某些工作。

答案 1 :(得分:3)

  

字符串出现的次数以及映射到某个数字的次数。

如果这是您尝试解决的具体问题,我会尝试将字符串映射到collection.Counter个实例。然后,您可以通过字符串键,然后通过数字键(以获取“计数”值)(data['abc'][2] - > 1)轻松查找,或者按字符串键查找并对值进行求和。获取总出现次数的计数器(sum(data['abc'].values()) - > 2)。

答案 2 :(得分:1)

您可以在此处使用defaultdict

from collections import defaultdict

data = defaultdict(list)
with open("input.txt", "rb") as f:
    for line in f:
        key, value = line.split()
        data[key].append(value)

defaultdict的优点是您不需要为遇到的每个新密钥初始化一个空列表。

找出密钥出现的次数是一个简单的len(data[key])语句。

在将其保存为pickle时,或者每个键都有一个条目,并在文件中使用逗号分隔值,以便您以后可以快速重建它:

with open("output.txt", "wt") as f:
    for key in data:
        f.write("{} {}\n".format(key, ','.join(data[key])))