在 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&#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】:

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


使用新样式类或元组

您的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()]

【讨论】:

以上是关于在 Python 中按键拆分字典的主要内容,如果未能解决你的问题,请参考以下文章

python:遍历按键排序的字典

python 字典按键值排序

python 字典按键值排序

python:将文件读取并拆分到字典列表中

在 Python 中将分号分隔的字符串拆分为字典

Python Pandas:如何在数据框的列中拆分已排序的字典