我有一个文本文件名xrb.txt,前几行看起来像这样 -
1 N.A. 9.10 9.66
2 N.A. 8.20 8.48
3 N.A. 8.70 8.11
4 6.34 4.60 4.39
5 6.07 <5.74 4.35
6 N.A. 5.10 4.42
7 2.92 3.20 2.05
8 <1.25 1.44 0.72
我需要创建一个字典,第一列(即1,2,3 ......)作为键,其他行作为每个键的值。
在python中有一种简单的方法吗?
我正在尝试以下操作,但它无法正常工作,我确信我的工作有点太复杂了:
xrbdic = {}
f = open("xrb.txt")
for line in f:
line = line.strip()
pa = [p.strip() for p in line.split()]
xrbdic[parts[0]] = (pa[1], pa[2], pa[3])
答案 0 :(得分:4)
你的代码不起作用的唯一原因是愚蠢的错字:
xrbdic[parts[0]] = (pa[1], pa[2], pa[3])
这会在NameError
上引发parts
,因为没有这样的变量。将其更改为pa
,您就可以得到您要求的字典。
与此同时,你并没有过分复杂的事情。但是你可以简化一下吗?肯定。
首先,line.split()
已经剥离了分割部分之间的所有空白,因此您无需单独剥离它们。
这包括尾随换行符,因此您也不需要使用行宽条带。
其次,您可以使用切片而不是显式列出所有部件。
虽然我们正在使用它,但你永远不会close
该文件,除了快速和肮脏的脚本之外什么都不会立即退出。您可以使用with
语句使其更简单。
所以:
xrbdic = {}
with open("xrb.txt") as f:
for line in f:
pa = line.split()
xrbdic[pa[0]] = pa[1:]
然后很容易将整个事物变成一个词典理解:
with open('xrb.txt') as f:
xrbdic = {pa[0]: pa[1:] for pa in map(str.split, f)}
答案 1 :(得分:1)
您需要将代码中的最后一行更改为以下内容。
xrbdic[pa[0]] = (pa[1], pa[2], pa[3])
你写了部分,实际上你应该写了pa。
答案 2 :(得分:0)
词典理解可能是一个更惯用的答案。
with open('xrb.txt','r') as f:
text = f.readlines()
###please ignore
#xrbdic = {p.split()[0]:(p.split()[1],p.split()[2],p.split()[3]) for p in raw_text}
##old ugly one-liner
rows = [line.split() for line in lines]
xrbdic = {row[0]:(row[1],row[2],row[3]) for row in rows}