有相同键的(嵌套)词典的python替代方法?

2024-10-04 07:35:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我发现自己避免使用字典,因为它们的代码通常有将近一半是重复的。我通常在嵌套字典中执行此操作,其中所有子字典都包含相同的键,但值不同。在

我手动创建一个大型父字典,其中每个键都包含一个嵌套字典,用于外部模块。嵌套字典都使用相同的键来定义配置参数。这种用法是显式的,可以使用,但是为我手动创建的每个嵌套字典重新键入或复制/粘贴键会感觉很愚蠢。我不太关心优化内存或性能,只是想知道我是否应该用另一种更像Python的方式来做这件事。在

作为一个常见的小例子和模式:

people_dict = {
    "Charles Lindberg": {"address": "123 St.", 
                         "famous": True}, 
    "Me": {"address": "456 St.",
           "famous": False}
    }

>>>people_dict["Charles Lindberg"]["address"]
"123 St."

虽然dictionary支持显式代码,但是定义具有重复键的嵌套字典是乏味且容易出错的。在本例中,有一半的嵌套字典是所有嵌套字典共有的代码重复代码。 我尝试过使用元组来消除重复键,但是发现这会导致代码脆弱——任何位置的改变(而不是字典键)都会失败。这也会导致代码不明确且难以遵循。在

^{pr2}$

相反,我编写了一个类来封装相同的信息:这个 成功减少重复代码。。。在

class Person(object):
    def __init__(self, address, famous=False):
        self.address = address
        self.famous = famous

people_dict = [
    "Charles Lindberg": Person("123 St.", famous=False), 
    "Me": Person("456 St."), 
    ]

>>>people_dict["Charles Lindberg"].address
"123 St." 

创建一个类似乎有点过分了。。。标准数据类型似乎太基本了。。。在

我想在Python中有更好的方法来实现这一点,而不必编写自己的类?在

在使用公共键创建嵌套字典时,避免重复代码的最佳方法是什么?在


Tags: 代码selffalse字典定义address手动people
3条回答

如果您想要一个dict,其中所有值都是具有相同或相似键的dict,那么可以定义一个函数,该函数接受这些值并返回其中一个内部dict。在

def hash(address, famous): return {"address": address, "famous": famous}

people_dict = {
    "Charles Lindberg": hash("123 St.", true),
    "Me": hash("456 St.", false)
}

听起来你有一个数据矩阵,因为每个“行”都有相同的键(列),所以我使用NumPy数组:

import numpy as np

dtype = [('name', object), ('address', object), ('famous', bool)]
people = np.array([
        ("Charles Lindberg", "123 St.", True),
        ("Me", "456 St.", False),
        ], dtype)

charlie = people[people['name'] == 'Charles Lindberg'][0]
print charlie['address']

或者使用更高级的熊猫:

^{pr2}$

它可以很容易地将dicts的原始dict直接加载到矩阵中,并提供类似的查找特性。在

首先,您可以阅读上面的链接以获取有关名称元组的更多信息:https://docs.python.org/2/library/collections.html#collections.namedtuple

NamedTuples可以帮助您避免“重复代码”。您可以为address创建一个namedtuple并使用它来定义。
我,尤其喜欢物体。OO对于这个问题有更好的解决方案。您可以创建一个方法do export object to a dict

对于函数范式,最好使用列表、数组和dict,因为有很多方法/函数可以帮助处理这种结构(map、reduce等)。如果你没有假装在你的应用中使用一些功能,那就去OO(面向对象的)soluction。在

问候 安德烈

相关问题 更多 >