我手头的任务是,我必须把一个文件的表内容放在字典结构中。该文件包含如下内容:(ascii文件的前六行)
名称0.4877 12.0730 0.2033 0.08 1.82 1.81 17.9 3.24 5.1 1
RXCJ0004.9+1142 UGC00032 1.2473 11.7006 0.0761 0.17 3.78 3.68 12.7 0.93 5.3 2,4
RXCJ0005.3+1612 A2703 1.3440 16.2105 0.1164 0.24 4.96 4.94 11.8 2.88 B2,5
RXCJ0006.3+1052 a) 1.5906 10.8677 0.1698 0.15 3.28 3.28 19.3 4.05 5.6 1
如果需要的话,我可以提供一个文件示例。
下面的代码运行良好,直到将每行dict存储到第二个dict。
#!/usr/bin/env python3
from collections import *
from re import *
obsrun = {}
objects = {}
re = compile('\d+.\d\d\d\d')
filename = 'test.asc'
with open(filename, 'r') as f:
lines = f.readlines()
for l in line[2:]:
#split the read lines into a list
o_bject = l.split()
#print(o_bject)
#interate over each entry and people the line-dictionary with values of interest
#what's needed (in col of table): identifier, common name, rightascension, declination
for k in o_bject:
objects.__setitem__('id', o_bject[0])
objects.__setitem__('common_name', o_bject[1])
# sometimes the common name has blanks, multiple entries or replacements
if re.match(o_bject[2]):
objects.__setitem__('ra', float(o_bject[2] ) )
objects.__setitem__('dec', float(o_bject[3] ) )
else:
objects.__setitem__('ra', float(o_bject[3] ) )
objects.__setitem__('dec', float(o_bject[4] ) )
#extract the identifier (name of the object) for use as key
name = objects.get('id')
#print(name)
print(objects) #*
# as documented in http://stackoverflow.com/questions/1024847/add-to-a-dictionary-in-python
obsrun[name] = objects
#print(obsrun)
#getting an ordered dictionary sorted by keys
OrderedDict(sorted(obsrun.items(), key= lambda t: t[0] ) ) #t[0] keys,t[1] values从控制台上的输出可以看出,内部for-循环执行应该做的事情。它是由*处的打印(对象)确认的。但是,当谈到将行切作为值存储在第二个dict中时,它是具有相同值的人。钥匙是正确的。
我不明白的是,print()命令显示了"objects“的正确内容,但是它们没有被正确地存储到”默示“中。错误在于对自然的看法,还是我做错了什么?
我应该如何改进代码?
提前谢谢你,克里斯蒂安
发布于 2014-04-29 15:31:22
您只创建了一个字典,因此每次在循环中都要修改同一个字典。
移动线
objects = {}进入for l in line[2:]:循环。这将为文件的每一行创建一个单独的dict。
此外,直接使用__setitem__也是不必要的,并且使代码更难阅读。将行从objects.__setitem__('id', o_bject[0])更改为objects['id'] = o_bject[0]。
发布于 2015-07-08 05:03:32
值得指出的是,除非你试图按名字查找条目,否则你真的不需要一个白痴。(这里,您没有解释用例是什么。)
从代码中跳出来的一件事是,您经常使用setitem --我认为您可能来自于C++或Java,在那里字典中没有内置的语言支持。在Python中,情况并非如此--您可以使用dkey=value来向字典中添加项。
下面是一些创建字典列表(数组)的代码。让Table成为一个字段上的字典将是非常简单的事情。我把这个留给你去弄清楚。:)
或者,如果您的问题是要对数据执行计算,则列表比dict要容易得多。因此,如果您必须加起来、平均起来或找到min/max,您可能需要这个版本。#!/usr/bin/env python3 -tt
data = open('test.asc')
header = data.readline().replace('-', '')
Field_names = header.split('|')
Table = []
# Read in the remaining lines, one at a time
for line in data:
fields = line.split()
Table.append(dict(zip(Field_names, fields)))
from pprint import pprint
pprint(Table)发布于 2014-04-29 15:46:01
所以你说,把“对象”给模糊就是链接“对象”而不是复制内容?所以我必须保留每一个内在的数据,因为它只是相互关联的。
你说的setitem是对的。我用它来让我更清楚,我到底在那里做什么。
我将尝试将对象= {}移动到内部for-循环中。
谢谢你的回答。如果这招成功了我会回来报告的。
更新:成功了!非常感谢,我真的被困在那里了,但是我学到了一些关于字典的重要知识,在这个例子中,它们只是链接在一起,所以这已经是在节省内存了。干杯,克里斯蒂安
https://stackoverflow.com/questions/23352359
复制相似问题