存储具有非唯一键值对的大型字典
Storing a large dictionary with non-unique key-value pairs
我有一个大的(超过一百万个字符)这种形状的文本文件:
'abc' 2
'nmb' 3
'sds' 5
'abc' 6
如您所见,每一行都有两个元素。每行上的对不是唯一的,这意味着 'abc' 可以映射到 2 和 3 甚至更多。我需要将其存储到可以保存到文件的合适数据结构中。稍后我想看看一个字符串出现了多少次以及它被映射到某个数字的次数。我需要能够相对快速地执行此操作,否则我只能按原样使用该文件。
我首先尝试使用 json
库创建字典并存储数据,这非常简单直接。但后来我意识到我不能使用它,因为键值对不是唯一的,一个键可以映射到多个值,数据结构应该保留它。
考虑到文件的大小和我想要使用它的方式,执行此操作的好方法是什么?
dict
个 list
怎么样?:
{
'abc': [2, 6],
'nmb': [3],
'sds': [5]
}
进一步了解 OP 的用例后进行编辑:您也可以这样做:
{
'abc': {2: 3, 6: 7},
'nmb': {3: 1},
'sds': {5: 1},
}
您还可以使用其他答案中提到的 defaultdict
和 collections.Counter
来简化某些工作。
您可以在此处使用 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])))
how many times a string has showed up and how many times it has been mapped to a certain number.
如果这是您要解决的具体问题,我会尝试将字符串映射到 collection.Counter
个实例。然后,您可以通过字符串键然后通过数字键(以获取 "count" 值)(data['abc'][2]
-> 1
)简单地查找,或者通过字符串键查找并对值求和计数器以获得总出现次数 (sum(data['abc'].values())
-> 2
).
我有一个大的(超过一百万个字符)这种形状的文本文件:
'abc' 2
'nmb' 3
'sds' 5
'abc' 6
如您所见,每一行都有两个元素。每行上的对不是唯一的,这意味着 'abc' 可以映射到 2 和 3 甚至更多。我需要将其存储到可以保存到文件的合适数据结构中。稍后我想看看一个字符串出现了多少次以及它被映射到某个数字的次数。我需要能够相对快速地执行此操作,否则我只能按原样使用该文件。
我首先尝试使用 json
库创建字典并存储数据,这非常简单直接。但后来我意识到我不能使用它,因为键值对不是唯一的,一个键可以映射到多个值,数据结构应该保留它。
考虑到文件的大小和我想要使用它的方式,执行此操作的好方法是什么?
dict
个 list
怎么样?:
{
'abc': [2, 6],
'nmb': [3],
'sds': [5]
}
进一步了解 OP 的用例后进行编辑:您也可以这样做:
{
'abc': {2: 3, 6: 7},
'nmb': {3: 1},
'sds': {5: 1},
}
您还可以使用其他答案中提到的 defaultdict
和 collections.Counter
来简化某些工作。
您可以在此处使用 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])))
how many times a string has showed up and how many times it has been mapped to a certain number.
如果这是您要解决的具体问题,我会尝试将字符串映射到 collection.Counter
个实例。然后,您可以通过字符串键然后通过数字键(以获取 "count" 值)(data['abc'][2]
-> 1
)简单地查找,或者通过字符串键查找并对值求和计数器以获得总出现次数 (sum(data['abc'].values())
-> 2
).