我在文件
中列出的字典列表如下[1,{'a':1,'b':8,'c':15}]
[2,{'j':2,'k':10,'a':15}]
........................
........................
我有一个主词典,其中包含以下格式的上述词典列表的所有键 {0:' c',1:' b',2:' j',3:' a',4:&#39 ; K'}
对于我想要处理字典的每一行,如下所示 [1,{3:1,1:8,0:15}] [2,{2:2,4:10,3:15}]
此处的值与输入行的值相同。键将是与主词典中的值对应的键。
for list1elem in listofemail[1:]:
d = {k: list1elem[v] for k,v in vocab_dic.items() if v in list1elem}
print(d)
但是花了很多时间,因为我的文件包含大约25000行,而主词典包含25000个单词。我也从8个目录中读取这样的文件。所以我还有两个for循环
for dirpath, dirs, files in os.walk('email'):
files = [fi for fi in files if not fi.startswith("kjjii")]
for filename in fnmatch.filter(files, '*.txt'):
with open(os.path.join(dirpath, filename)) as f:
lines = f.read().splitlines()
for list1elem in listofemail[1:]:
d = {k: list1elem[v] for k,v in vocab_dic.items() if v in list1elem}
print(d)
它运行了15分钟。需要帮助来优化它。
答案 0 :(得分:0)
这是我能想到的最快,而不使用多处理。如果您使用的是python3,则可以通过调用d[k]
(或python2中的d.items()
)优化所有d.iteritems()
次调用。
import os
import ast
master = {0:'c', 1:'b', 2:'j', 3:'a', 4:'k'}
masterev = {master[k]:k for k in master}
answer = {}
for dirpath, dirnames, fnames in os.walk('email'):
for fname in fnames:
if not fname.startswith('kijiji'): continue
if not fname.endswith('.txt'): continue
contents = []
fpath = os.path.join(dirpath, fname)
with open(fpath) as infile:
for line in infile:
L = ast.literal_eval(line.strip())
for num, d in L:
contents.append([num, {masterev[k]:d[k] for k in d}])
answer[fpath] = contents