En basit çözümün iki aralığı *
paketten çıkarma operatörünü kullanarak bir listeye açmak olduğunu söyleyebilirim :
>>> [*range(6, 10), *range(-9, -5)]
[6, 7, 8, 9, -9, -8, -7, -6]
Bu henüz önerilen en kısa cevap değil, aynı zamanda en yüksek performanstır, çünkü sadece tek bir liste oluşturur ve iki range
s'nin ötesinde hiçbir işlev çağrısı içermez .
timeit
Modülü kullanarak bu sorunun tüm cevaplarını test ederek bunu doğruladım :
Yanıt Kimliği Yöntemi timeit sonucu
-------------------------------------------------- ------------------------------------------------
(söz konusu) [aralıktaki x için x (6,10)] + [aralıktaki y için y (-9, -5)] Döngü başına 0,843 usec
(bu cevap) [* aralık (6, 10), * aralık (-9, -5)] Döngü başına 0,509 usec
61348876 [y için x aralığında (6,10) y için (x, -x)] döngü başına 0,754 usec
61349149 listesi (range_with_negatives (6, 10)) Döngü başına 0,795 usec
61348914 listesi (itertools.chain (aralık (6, 10), aralık (-9, -5))) döngü başına 0,709 usec
61366995 [işaret * x işaret için, itertools.product içindeki x ((- 1, 1), aralık (6, 10))] döngü başına 0,899 usec
61371302 liste (aralık (6, 10)) + liste (aralık (-9, -5)) döngü başına 0,729 usec
61367180 liste (range_with_negs (6, 10)) Döngü başına 1,95 usec
(kendi bilgisayarımda Python 3.6.9 ile yapılan timeit testi (ortalama özellikler))