减去元组

时间:2014-09-18 14:29:11

标签: python

在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感兴趣。

我希望上面定义的所有变量都是不可变的,因为它们永远不会改变。我也希望他们的订单总是一样的,因为我希望我的测试能够始终如一。

2 个答案:

答案 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_modesfast_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_modesfast_modes setfrozenset对象not in成对测试会更快。

答案 1 :(得分:1)

使用套装:

modes = {1,2,4,5,7,8,9}
stop_modes = modes - {1,2,5}