在 Python 中按键拆分字典
Posted
技术标签:
【中文标题】在 Python 中按键拆分字典【英文标题】:Split dictionary by keys in Python 【发布时间】:2014-10-26 23:43:49 【问题描述】:我想澄清一下这段代码,尤其是变量。我是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")
【问题讨论】:
【参考方案1】:“清理这个(工作)代码”通常不是一个好的 SO 问题,因为它非常模糊。 我投了反对票,但在这种特殊情况下,您可以立即完成一些事情。
使用新样式类或元组
您的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()]
【讨论】:
以上是关于在 Python 中按键拆分字典的主要内容,如果未能解决你的问题,请参考以下文章