在Python中按键拆分字典

时间:2014-09-02 16:18:46

标签: python json list dictionary

我想澄清这段代码,特别是变量。我是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&#225; Streda</td><td>201</td></tr>\n', '<tr><td>Dunajsk&#253; Kl&#225;tov</td><td>201</td></tr>\n'], '205': ['<tr><td>Ko&#353;oln&#225;</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 个答案:

答案 0 :(得分:-1)

“清理此(工作)代码”通常不是一个好的问题,因为它非常模糊。 我已经投票了,但是,在这个特殊情况下,你有一些事情可以立即完成。


使用新样式类或元组

您的Ward课程似乎没必要。 除非你没有显示其他功能,否则你应该创建元组。 而不是Ward(k, v)只使用元组(k, v)

如果你确实需要这个类,至少要把它写成一个新的样式类,class Ward(object): 您使用的语法class Ward:仅在历史原因下被弃用和支持。

保持数据外部代码

现在,你有一个巨大的,凌乱的,难以使用变量,

pairs = {'201': ['<tr><td>Dunajsk&#225; Streda</td><td>201</td></tr>\n', '<tr><td>Dunajsk&#253; Kl&#225;tov</td><td>201</td></tr>\n'], '205': ['<tr><td>Ko&#353;oln&#225;</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&#353;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&#382;ie</td><td>304</td></tr>\n', '<tr><td>Se&#269;</td><td>304</td></tr>\n', '<tr><td>&#352;&#250;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&#233; Mesto</td><td>101</td></tr>\n', '<tr><td>Bratislava - Podunajsk&#233; Biskupice</td><td>101</td></tr>\n'], '806': ['<tr><td>Plechotice</td><td>806</td></tr>\n', '<tr><td>Trebi&#353;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()]