2014-09-18 2 views
-1

Что такое элегантный способ сделать следующее питона:Вычитание кортежи

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 s, например.

Я хочу, чтобы все переменные, определенные выше, были неизменными, поскольку они никогда не должны меняться. Я также предпочел бы, чтобы их заказ всегда был одним и тем же, поскольку я бы хотел, чтобы мои тесты велись последовательно.

+1

Пожалуйста, сообщите нам результат, который вы хотите достичь – Jesuisme

+0

@Jesuisme Вопрос обновлен – Baz

+0

Пример желаемого результата пожалуйста; (1,2,4) - (1,2) = (4,) – Jesuisme

ответ

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_modesset или frozenset объектов not in отрицательные тесты на членство будут быстрее.

+0

Я хочу, чтобы режимы были неизменными – Baz

+1

'frozenset', а? – chepner

+0

@chepner: Мне нужно больше чая, очевидно. Исправленный. –

1

Используйте набор:

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

Я хочу, чтобы режимы были неизменными – Baz

+1

@Baz: тогда вы можете использовать 'frozenset'. – geoffspear