正如其他人所建议的那样,不太可能将10个不同的局部变量与布尔值一起使用是编写例程的最佳方法(尤其是如果它们确实具有一个字母的名称时:)
根据您正在执行的 *** 作,可以改用词典。例如,如果要为一组单字母标志设置布尔值预设值,则可以执行以下 *** 作:
>>> flags = dict.fromkeys(["a", "b", "c"], True)>>> flags.update(dict.fromkeys(["d", "e"], False))>>> print flags{'a': True, 'c': True, 'b': True, 'e': False, 'd': False}
如果您愿意,也可以使用一个赋值语句来做到这一点:
>>> flags = dict(dict.fromkeys(["a", "b", "c"], True),... **dict.fromkeys(["d", "e"], False))>>> print flags{'a': True, 'c': True, 'b': True, 'e': False, 'd': False}
的第二个参数
dict并非完全为此目的而设计的:它的真正含义是允许您使用关键字参数(如)来覆盖字典中的各个元素
d=False。上面的代码将表达式的结果
**分解为一组关键字参数,这些参数传递给调用的函数。这当然是创建字典的可靠方法,而且人们似乎至少接受了这种习语,但我怀疑有人可能认为它是非Python的。
</disclaimer>
另一种方法,这是最直观的,如果你会经常使用这种模式,是定义你的数据作为标志值(列表
True,
False映射到标志名(单字符串))。然后,您可以将此数据定义转换为反向字典,该字典将标志名称映射到标志值。使用嵌套列表理解可以很简洁地完成此 *** 作,但是这是一个非常易读的实现:
>>> def invert_dict(inverted_dict):... elements = inverted_dict.iteritems()... for flag_value, flag_names in elements:... for flag_name in flag_names:... yield flag_name, flag_value... >>> flags = {True: ["a", "b", "c"], False: ["d", "e"]}>>> flags = dict(invert_dict(flags))>>> print flags{'a': True, 'c': True, 'b': True, 'e': False, 'd': False}
该函数
invert_dict是一个生成器函数。它
生成 或 产生 -意味着它 反复返回
-键值对的值。这些键值对是初始
flags字典中两个元素的内容的逆。它们被送入
dict构造函数。在这种情况下,
dict构造函数的工作原理与上面的有所不同,因为构造函数被作为迭代器而不是字典作为参数。
借鉴@Chris Lutz的评论:如果您真的将它用于单字符值,则可以
>>> flags = {True: 'abc', False: 'de'}>>> flags = dict(invert_dict(flags))>>> print flags{'a': True, 'c': True, 'b': True, 'e': False, 'd': False}
这是 可行的 ,因为Python字符串是
可迭代的
,这意味着它们可以逐值移动。对于字符串,值是字符串中的各个字符。因此,当它们被解释为可迭代时,例如在这种情况下,它们在for循环中使用,
['a','b','c']并且
'abc'实际上是等效的。另一个示例是将它们传递给需要迭代的函数时,例如
tuple。
我个人不会这样做,因为它不能直观地理解:当我看到一个字符串时,我希望它可以用作单个值而不是列表。因此,我看第一行,并认为“好吧,所以有一个True标志和一个False标志。”
因此,尽管有可能,但我不认为这是可行的方法。从好的方面来说,这可能有助于更清楚地解释可迭代和迭代器的概念。
定义函数
invert_dict以使其实际上返回字典也不是坏主意。我大多只是不这样做,因为它并不能真正帮助解释例程的工作原理。
显然,Python 2.7具有字典理解功能,这将为实现该功能提供一种极为简洁的方法。这留给读者练习,因为我没有安装Python 2.7 :)
您还可以结合功能广泛的itertools模块中的某些功能。正如他们所说,做到这一点不止一种方法。等等,Python人士不这么说。好吧,在某些情况下还是如此。我猜想圭多(Guido)已经给了我们字典理解能力,因此会有一种明显的方式来做到这一点。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)