我想澄清这段代码,特别是变量。我是python
的新手。
目标:
我希望通过此词典的pairs
拆分数据字典keys
。输出是类Ward
的列表列表。我想,我的解决方案太复杂了,是另一种更好的解决方案吗?
class Ward:
def __init__(self, code, data):
self.code = code
self.data = data
def prepare_data_for_templates(cs, h, f):
pairs = {'201': ['<tr><td>Dunajská Streda</td><td>201</td></tr>\n', '<tr><td>Dunajský Klátov</td><td>201</td></tr>\n'], '205': ['<tr><td>Košolná</td><td>205</td></tr>\n',]}
print "Pairs: " + str(sorted(pairs.keys())) + "\n"
#output data - ba, tt...
OUT = []
BA = []
TT = []
for k, v in sorted(pairs.iteritems()):
#print k + "\n", v
if int(k) < 199:
BA.append( Ward(k, v )
elif int(k) < 299:
TT.append( Ward(k, v )
OUT.append(BA)
OUT.append(TT)
for j in OUT:
for i in j:
print i.code
return OUT
编辑:感谢您的回答,我使用json更新了我的代码。
tab01.json:
{
"data": [
{
"id": "101", "c01": "mun1"
},
{
"id": "101", "c01": "mun2"
},
{
"id": "205", "c01": "mun3"
},
{
"id": "205", "c01": "mun4"
},
{
"id": "205", "c01": "mun5"
}
]
}
code.py:
import os, json
def prepare_data_for_templates(file):
pairs = {}
codes = []
with open(file, "r") as input:
json_obj = json.load(input)
for d in json_obj["data"]:
codes.append((str(d["id"]), d))
for c in codes:
pairs.setdefault(str(c[0]), []).append(c[1])
for k, v in pairs.iteritems():
with open( str(k) + '.json', 'w') as outfile:
json.dump(v, outfile)
prepare_data_for_templates("tab01.json")
答案 0 :(得分:-1)
“清理此(工作)代码”通常不是一个好的问题,因为它非常模糊。 我已经投票了,但是,在这个特殊情况下,你有一些事情可以立即完成。
您的Ward
课程似乎没必要。
除非你没有显示其他功能,否则你应该创建元组。
而不是Ward(k, v)
只使用元组(k, v)
。
如果你确实需要这个类,至少要把它写成一个新的样式类,class Ward(object):
您使用的语法class Ward:
仅在历史原因下被弃用和支持。
现在,你有一个巨大的,凌乱的,难以使用变量,
pairs = {'201': ['<tr><td>Dunajská Streda</td><td>201</td></tr>\n', '<tr><td>Dunajský Klátov</td><td>201</td></tr>\n'], '205': ['<tr><td>Košolná</td><td>205</td></tr>\n', '<tr><td>Leopoldov</td><td>205</td></tr>\n', '<tr><td>Trnava</td><td>205</td></tr>\n'], '705': ['<tr><td>Pušovce</td><td>705</td></tr>\n', '<tr><td>Radatice</td><td>705</td></tr>\n', '<tr><td>Rokycany</td><td>705</td></tr>\n'], '304': ['<tr><td>Rudnianska Lehota</td><td>304</td></tr>\n', '<tr><td>Sebedražie</td><td>304</td></tr>\n', '<tr><td>Seč</td><td>304</td></tr>\n', '<tr><td>Šútovce</td><td>304</td></tr>\n'], '305': ['<tr><td>Selec</td><td>305</td></tr>\n'], '103': ['<tr><td>Modra</td><td>103</td></tr>\n', '<tr><td>Pezinok</td><td>103</td></tr>\n'], '101': ['<tr><td>Bratislava - Nové Mesto</td><td>101</td></tr>\n', '<tr><td>Bratislava - Podunajské Biskupice</td><td>101</td></tr>\n'], '806': ['<tr><td>Plechotice</td><td>806</td></tr>\n', '<tr><td>Trebišov</td><td>806</td></tr>\n']}
如果您想要添加数据或数据更改,则几乎无法维持。 这看起来像某种类型的部分解析的HTML,因此这可能是一种更好的存储数据的形式,并让你的python代码在每次运行时解析HTML。
如果您想保留已处理的数据,而不是原始的HTML源,我建议将其放入JSON文件中;像这样的东西:
{
"201": {
"name": "Dunajsky",
"municipalities": [
"Streda",
"Klatov"
]
},
"205": {
"name": "Kosoln",
"municipalities": {
"Leopoldov",
"Trnava"
}
}
}
您的数据非常脏,所以这只是我对您尝试表示的结构的最佳猜测。 这将使您的生活更加轻松。
然后,您可以使用python json
库解析此数据:
据我所知,您正在尝试对数据进行排序。 没有必要为此目的列出一个列表 - 它不必要地复杂化,结果令人困惑。
考虑更像这样的事情:
with open('wards.json', 'r') as f:
json_obj = json.load(f)
# assume the structure above is used for the JSON
# don't do any validation (because that would require more work with something
# like a JSON schema, and I'm too lazy for that)
# convert the object to a list of tuples, and convert codes from strings to ints
code_list = []
for (code, data) in json_obj.items():
code_list.append((int(code), data))
# sorting tuples does a dictionary-order sorting, so this will sort on keys,
# then on the data components of the tuples (which presumably don't have
# meaningful ordering)
return sorted(code_list)
转换为code_list
的稍微更简洁的版本会使用理解:
code_list = [(int(code), data) for (code, data) in json_obj.items()]