【发布时间】:2014-02-07 08:54:39
【问题描述】:
我有一个长的(500K+ 行)两列电子表格,如下所示:
Name Code
1234 A
1234 B
1456 C
4556 A
4556 B
4556 C
...
所以有一个元素(带有名称)可以有多个代码。但不是每个代码一行,我想列出每个元素出现的所有代码。我想要的是这样的字典:
{"1234":["A","B"],"1456":["C"],"4556":["A","B","C"] ...]}
我尝试过的是这个(我不包括文件读取语法)。
codelist = {}
for row in rows:
name,code = well.split()
if name in codelist.keys():
codelist[name].append(code)
else:
codelist[name] = [code]
这会产生正确的输出,但进度会变得非常缓慢。所以我尝试用键启动我的字典:
allnames = [.... list of all the names ...]
codelist = dict.fromkeys(allnames)
for row in rows:
name,code = well.split()
if codelist[name]:
codelist[name].append(code)
else:
codelist[name] = [code]
这要快得多,我的问题是为什么?程序不是每次都要搜索字典中的所有键吗?是否有另一种方法可以加快不包括遍历树的 dict 搜索?
有趣的是当我在启动字典后使用与以前相同的条件检查(如果在 codelist.keys():) 中使用相同的条件检查时遇到的错误。
Traceback (most recent call last):
File ....
codelist[name].append(code)
AttributeError: 'NoneType' object has no attribute 'append'
现在,有一个键,但没有要附加的列表。所以我使用codelist[name],它也是<NoneType>,并且似乎可以工作。当mydict["primed key"] 是<NoneType> 时是什么意思?enter code here
【问题讨论】:
-
@AC,抱歉 - 从 IDLE 剪切/粘贴...应该是 {}。我已经编辑了帖子。
-
不知道确切,但是您正在检查 codelist.keys(),这将创建一个列表或一个视图,而您可以执行 'name in codelist' 并直接进行查找
标签: python performance search dictionary