具有可选标志的值列表的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
)。这简化了合同(“…返回一个完全包含项目上设置的标志的列表”),意味着您可以对