在python中执行以下操作的优雅方法是什么:
modes = (1,2,4,5,7,8,9)
start_modes = (1,2,5)
stop_modes = tuple(set(modes) - set(start_modes))
fast_modes = (2,7)
slow_modes = tuple(set(modes) - set(fast_modes))
我定义了我正在测试的系统的行为。在我的测试中,我有时会对迭代所有modes
感兴趣,有时我会对迭代slow_mode
感兴趣。
我希望上面定义的所有变量都是不可变的,因为它们永远不会改变。我也希望他们的订单总是一样的,因为我希望我的测试能够始终如一。
答案 0 :(得分:2)
您改为使用sets:
modes = frozenset([1,2,4,5,7,8,9])
start_modes = {1,2,5}
stop_modes = modes - start_modes
fast_modes = {2,7}
slow_modes = modes - fast_modes
此处frozenset()
是set()
相当于tuple()
;不可变的类型。 start_modes
和fast_modes
集使用{...}
集合文字表示法,而是生成可变set()
对象。您也可以随时使用frozenset()
。
集合只能包含唯一元素,不能维护元素的顺序。你仍然可以将一个集转换回一个元组,但是一个元组似乎是你问题的错误数据类型。
集合是可迭代的;你可以遍历这些,但顺序取决于集合的插入和删除历史以及包含的值。
如果订单 很重要,请在tuple()
调用中使用生成器表达式来生成您的值:
modes = (1, 2, 4, 5, 7, 8, 9)
start_modes = (1, 2, 5)
stop_modes = tuple(m for m in modes if m not in start_modes)
fast_modes = (2, 7)
slow_modes = tuple(m for m in modes if m not in fast_modes)
虽然这里没有太大区别,但如果您可以start_modes
和fast_modes
set
或frozenset
对象not in
成对测试会更快。
答案 1 :(得分:1)
使用套装:
modes = {1,2,4,5,7,8,9}
stop_modes = modes - {1,2,5}