Я бы сказал, что самое простое решение - распаковать два диапазона в список с помощью *оператора распаковки:
>>> [*range(6, 10), *range(-9, -5)]
[6, 7, 8, 9, -9, -8, -7, -6]
Это не только самый короткий предложенный ответ, но и самый эффективный, потому что он создает только один список и не включает никаких вызовов функций, кроме двух range.
Я проверил это, протестировав ответы на все вопросы с помощью timeitмодуля:
Метод идентификатора ответа timeit результат
-------------------------------------------------- ------------------------------------------------
(в вопросе) [x для x в диапазоне (6,10)] + [y для y в диапазоне (-9, -5)] 0,843 мкс / цикл
(этот ответ) [* диапазон (6, 10), * диапазон (-9, -5)] 0,509 мкс на цикл
61348876 [y для x в диапазоне (6,10) для y в (x, -x)] 0,754 мкс на цикл
61349149 список (range_with_negatives (6, 10)) 0,795 мкс на цикл
61348914 список (itertools.chain (диапазон (6, 10), диапазон (-9, -5))) 0,709 пользователя на цикл
61366995 [знак * x для знака, x в itertools.product ((- 1, 1), диапазон (6, 10))] 0,899 мксек на цикл
61371302 список (диапазон (6, 10)) + список (диапазон (-9, -5)) 0,729 мксек на цикл
61367180 список (range_with_negs (6, 10)) 1,95 usec за цикл
(тестирование timeit, выполненное с Python 3.6.9 на моем собственном компьютере (средние характеристики))