具有可选标志的值列表的Python表示形式

具有可选标志的值列表的Python表示形式,python,Python,首先映入我脑海的是一本字典,其中键充当列表值,字典值默认为None,但这对我来说是次优的。任何人都可以提出一个单一的结构(即没有单独的“选项”dict)替代方案,其中dict[key]对未设置标志的项目返回None,否则返回标志列表?如果我忽略了一些明显的惯例,我道歉 此结构的一个简单用途是一个订单实例,其中每个项目都可以选择包含修改(即无螺母)。默认DICT可能会: from collections import defaultdict flags = defaultdict(lambda

首先映入我脑海的是一本字典,其中键充当列表值,字典值默认为
None
,但这对我来说是次优的。任何人都可以提出一个单一的结构(即没有单独的“选项”dict)替代方案,其中
dict[key]
对未设置标志的项目返回
None
,否则返回标志列表?如果我忽略了一些明显的惯例,我道歉


此结构的一个简单用途是一个
订单
实例,其中每个项目都可以选择包含修改(即无螺母)。

默认DICT可能会:

from collections import defaultdict

flags = defaultdict(lambda : None)
flags.update({'F1':True,'F3':True,'F8':True})

for f in 'F1 F2 F3 F4 F5 F6 F7 F8'.split():
    print f, '->', flags[f]
印刷品:

F1 -> True
F2 -> None
F3 -> True
F4 -> None
F5 -> None
F6 -> None
F7 -> None
F8 -> True

也许一个defaultdict可以:

from collections import defaultdict

flags = defaultdict(lambda : None)
flags.update({'F1':True,'F3':True,'F8':True})

for f in 'F1 F2 F3 F4 F5 F6 F7 F8'.split():
    print f, '->', flags[f]
印刷品:

F1 -> True
F2 -> None
F3 -> True
F4 -> None
F5 -> None
F6 -> None
F7 -> None
F8 -> True

有两种可能性:

1)
dict.get(key,None)
如果没有
key的条目,则返回
None


2)
dict=defaultdict(lambda:None)
创建一个dict,如果给定键没有条目,它会自动返回
None

有几种可能性:

1)
dict.get(key,None)
如果没有
key的条目,则返回
None


2)
dict=defaultdict(lambda:None)
创建一个dict,如果给定键没有条目,它会自动返回
None

正如您可能从我上面的评论中了解到的,我不确定您真正的需求是什么。但我的猜测是,它们与
defaultdict
的建议有点不同。在我看来,似乎您需要一个项目列表(有序,可能允许重复),每个项目都与一组可能为空的标志相关联。在这种情况下,最简单的解决方案可能是成对的列表
(项,标志)
,其中每个
标志都是一个集合对象

这并不能让您通过
项的值来查找标志,但我觉得这并不是您应该做的事情。(以您的餐厅订单为例,可能有两个人的
项目
是,比如说,
室内沙拉
,但其中只有一个人可能有
无坚果
标志。)

当然,您只需调用
list
,就可以从每个项目的集合中获得一个标志列表


在任何特定的应用程序中,创建一个类来保存这些信息并提供更透明的访问方式都是值得的。如果你意识到自己需要额外的功能(随机示例:找到带有给定标志的所有项目的能力),那么就可以更容易地添加这些功能。

正如你可能从我上面的评论中了解到的,我不确定你真正的需求是什么。但我的猜测是,它们与
defaultdict
的建议有点不同。在我看来,似乎您需要一个项目列表(有序,可能允许重复),每个项目都与一组可能为空的标志相关联。在这种情况下,最简单的解决方案可能是成对的列表
(项,标志)
,其中每个
标志都是一个集合对象

这并不能让您通过
项的值来查找标志,但我觉得这并不是您应该做的事情。(以您的餐厅订单为例,可能有两个人的
项目
是,比如说,
室内沙拉
,但其中只有一个人可能有
无坚果
标志。)

当然,您只需调用
list
,就可以从每个项目的集合中获得一个标志列表


在任何特定的应用程序中,创建一个类来保存这些信息并提供更透明的访问方式都是值得的。如果你意识到自己需要额外的功能,那就更容易添加这些功能(随机示例:能够找到带有给定标志的所有项目)。

是的,这很好。我想如果我建立自己的结构,我就得写一个经理。是的,这很好。我想如果我采用自己的结构,我必须要写一个经理。我可以鼓励你重新考虑你设计的一个方面吗?如果在有任何标志时返回标志列表,则在没有标志时可能应该返回空列表(而不是
None
)。这简化了契约(“…返回一个列表,其中正好包含在项上设置的标志”),意味着您可以在dict[key]中对标志说
:…
,而不需要显式的
None
测试或异常处理程序。当您说值列表时,您实际上是指列表吗(即有一个顺序,同一件事可以发生多次)或一组(即没有顺序,没有重复),或者什么?如果您想要的是一组项目而不是一个列表,那么使用
dict
defaultdict
似乎是一个不错的解决方案;否则就不太好。相反,您真的想要一个标志列表还是一个集合?我的想法是,如果列表为空,则返回
None
(同样的事情可能会发生多次,按照我之前的类比,这意味着相同项目的两个实例被订购,可能具有不同的选项),然后我可以使用
if list:
对具有选项的项目执行操作。但是,
()==False
,因此我使用了
defaultdict(lambda:())
。或者这是多余的吗?我想我可能自相矛盾。我不需要返回一个空列表,因为任何标记处理无论如何都会在
if list
块中。因此,除了一致性和惯例之外,返回一个我已知的空列表没有任何好处。我可以鼓励您重新考虑您的设计?如果您在有任何标志时返回一个标志列表,那么在没有标志时,您可能应该返回一个空列表(而不是
None
)。这简化了合同(“…返回一个完全包含项目上设置的标志的列表”),意味着您可以对