【发布时间】:2014-12-27 04:25:01
【问题描述】:
我发现自己避免使用字典,因为通常有近一半的代码是重复的。我通常在嵌套字典中执行此操作,其中所有子字典都包含相同的键,但值不同。
我手动创建了一个大型父字典,其中每个键都包含一个嵌套字典,以在外部模块中使用。嵌套字典都使用相同的键来定义配置参数。这种用法是明确的并且有效,但是为我手动创建的每个嵌套字典重新键入或复制/粘贴键感觉很愚蠢。我并不太关心优化内存或性能,只是想知道我是否应该以另一种更 Pythonic 的方式来做这件事。
作为一个常见的例子和模式:
people_dict = {
"Charles Lindberg": {"address": "123 St.",
"famous": True},
"Me": {"address": "456 St.",
"famous": False}
}
>>>people_dict["Charles Lindberg"]["address"]
"123 St."
虽然字典支持显式代码,但定义具有重复键的嵌套字典既繁琐又容易出错。在此示例中,嵌套字典的一半是所有嵌套字典共有的代码重复代码。 我曾尝试使用元组来消除重复键,但发现这会导致代码脆弱 - 任何位置更改(而不是字典键)都会失败。这也会导致代码不明确且难以遵循。
people_dict = {
"Charles Lindberg": ("123 St.", True),
"Me": ("456 St.", False),
}
>>>people_dict["Charles Lindberg"][0]
"123 St."
相反,我编写了一个类来封装相同的信息: 成功减少重复代码...
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 中有更好的方法来做到这一点,而不必编写自己的类?
在使用公共键创建嵌套字典时,避免重复代码的最佳方法是什么?
【问题讨论】:
-
你为什么要担心不同字典中的重复键?
-
要扩展上述内容,您无需担心嵌套字典中重复的字符串键(内存使用)。 Python 将字符串存储在内存中一次,然后使用指向同一字符串的指针/引用。
-
我创建的每个子词典都有 15 个相同的键。为了定义父字典,我最终复制并粘贴了一个 TON。这样做感觉不对,但我不知道有什么好的替代方案或最佳做法..
-
如果您更多地从性能的角度来看待它,那么 namedtuples docs.python.org/2/library/… 可能就是您所追求的。如果您能详细说明为什么您认为字典不是一个好的解决方案,它将帮助您找到更适合您情况的解决方案。
-
你想要的是一个命名元组。它们就像你的小类,只是它们包含更多功能并且需要更少的代码来定义。
标签: python class dictionary namedtuple