Skip to main content
 首页 » 编程设计

解析字典时的python KeyError

2025年05月04日11sharpest

如何加入这两个文本文档?

文档 1:

1000001 10:0.471669 250:0.127552 30:0.218773 64:0.249413 
1000002 130:0.0839656 107:0.185613 30:0.446355 110:0.38011 
1000003 1:0.0835855 1117:0.0647112 302:0.0851354 46:0.0601825 48:0.098907 516:0.167713 

文档 2:

1000001 161:0.115664 207:0.136537 294:0.0974809 301:0.199868 
1000002 
1000003 555:0.0585849 91:0.0164101 

结果:

1000001 10:0.471669 250:0.127552 30:0.218773 64:0.249413 161:0.115664 207:0.136537 294:0.0974809 301:0.199868 
1000002 130:0.0839656 107:0.185613 30:0.446355 110:0.38011 
1000003 1:0.0835855 1117:0.0647112 302:0.0851354 46:0.0601825 48:0.098907 516:0.167713 555:0.0585849 91:0.0164101 

解释:
文档 1 和 文档 2 结构相同,行数也相同。
每行以数字开头(两个文档中的数字相同), 然后我们在每一行中有几个项目,由一个数字+冒号+一个十进制数组成:
example 10:0.471669
这些项目组合是唯一的,我想做的是将它们合并在一起:从第二个文档中取出每一行的项目,并将其放入第一个文档的相应行中。
注意:
开头的初始数字和彼此之间的项目由一个空格分隔。

更新

这是我的尝试:

dat1 = {} 
with open('doc1') as f: 
    for line in f.readlines(): 
        dat1[line.split(' ')[0]] = line.strip().split(' ')[1:] 
 
dat2 = {} 
with open('doc2') as f: 
    for line in f.readlines(): 
        key = line.split(' ')[0] 
        dat2[key] = line.split(' ')[1:] 
 
for key in dat1.keys(): 
    print("%s %s %s" % (key, str.join(' ', dat1[key]), str.join(' ', dat2[key]))) 

当该行没有任何要添加到第一个文档时,我在第二个文档的行上得到了 KeyError 的回溯。上例中第二个文档的第二行就是这种情况。
如何逃避这个异常?转义只有键而没有其他要添加的行?

请您参考如下方法:

更简单的方法可能是使用 defaultdict列表:

from collections import defaultdict 
 
data = defaultdict(list) 
 
for filename in 'doc1', 'doc2': 
    with open(filename) as f: 
        for line in f: 
            key, _, value = line.partition(' ') 
            data[key.strip()].append(value.strip()) 
 
for key in sorted(data): 
    print key, ' '.join(data[key])    # Python 2 
#    print(key, *data[key])            # Python 3 

关于您可以添加的结果的打印:

from __future__ import print_function 

到你的文件的顶部,然后 Python 3 print() 函数将在 Python 2 中可用,即你可以使用上面的 Python 3 打印。


您在评论中询问了如何打印到文件(导入 print_function 后的 Python 3 或 Python 2):

with open('outfile.txt', 'w') as f: 
    for key in sorted(data): 
        print(key, *data[key], file=f)