Конкатенация результатов двух диапазонов

Предоставляет ли функция диапазона конкатенацию? Как я хочу сделать range(30) и объединить его с range(2000, 5002) . Таким образом, мой конкатенированный диапазон будет 0, 1, 2, ... 29, 2000, 2001, ... 5001

Код, подобный этому, не работает на моем последнем python (ver: 3.3.0)

 range(30) + range(2000, 5002) 

  • В чем разница между raw_input () и input () в python3.x?
  • Временная сложность os.walk в Python
  • Проблема с Python3 sleep ()
  • Как сохранить имена столбцов, начинающиеся с минуса при использовании numpy.genfromtxt?
  • Почему super () разбит на Python-2.x?
  • Оператор Python 3 >> для печати в файл
  • быстрые байты XORing в python 3
  • OpenCV для Python 3.5.1
  • 6 Solutions collect form web for “Конкатенация результатов двух диапазонов”

    Вы можете использовать itertools.chain для этого:

     from itertools import chain concatenated = chain(range(30), range(2000, 5002)) for i in concatenated: ... 

    Он работает для произвольных итераций. Обратите внимание, что существует разница в поведении range() между Python 2 и 3, о котором вам следует знать: в Python 2 range возвращает список, а в Python3 – итератор, который эффективен с точки зрения памяти, но не всегда желателен.

    Списки могут быть объединены с + , итераторы не могут.

    Может быть сделано с использованием списка .

     >>> [i for j in (range(10), range(15, 20)) for i in j] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 15, 16, 17, 18, 19] 

    Работает по вашему запросу, но это длинный ответ, поэтому я не буду публиковать его здесь.

    примечание: можно сделать в генератор для повышения производительности:

     for x in (i for j in (range(30), range(2000, 5002)) for i in j): # code 

    или даже в переменную генератора.

     gen = (i for j in (range(30), range(2000, 5002)) for i in j) for x in gen: # code 

    Мне нравятся самые простые решения, которые возможны (включая эффективность). Не всегда ясно, является ли решение таковым. В любом случае, range() в Python 3 является генератором. Вы можете привязать его к любой конструкции, которая выполняет итерацию. list() способен создавать значение списка из любого итерабельного. Оператор + для списков выполняет конкатенацию. Я использую меньшие значения в примере:

     >>> list(range(5)) [0, 1, 2, 3, 4] >>> list(range(10, 20)) [10, 11, 12, 13, 14, 15, 16, 17, 18, 19] >>> list(range(5)) + list(range(10,20)) [0, 1, 2, 3, 4, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] 

    Это то, что range(5) + range(10, 20) точно сделал в Python 2.5 – потому что range() вернул список.

    В Python 3 это полезно только в том случае, если вы действительно хотите создать список. В противном случае, я рекомендую решение Льва Левицкого с itertools.chain . В документации также показана очень простая реализация:

     def chain(*iterables): # chain('ABC', 'DEF') --> ABCDEF for it in iterables: for element in it: yield element 

    Решение Inbar Rose прекрасно и функционально эквивалентно. Во всяком случае, мой +1 идет к Льву Левицкому и к его аргументам об использовании стандартных библиотек. От Дзэн Питона

    Перед лицом двусмысленности откажитесь от соблазна угадать.

     #!python3 import timeit number = 10000 t = timeit.timeit('''\ for i in itertools.chain(range(30), range(2000, 5002)): pass ''', 'import itertools', number=number) print('itertools:', t/number * 1000000, 'microsec/one execution') t = timeit.timeit('''\ for x in (i for j in (range(30), range(2000, 5002)) for i in j): pass ''', number=number) print('generator expression:', t/number * 1000000, 'microsec/one execution') 

    По-моему, itertools.chain более читабельна. Но что действительно важно …

     itertools: 264.4522138986938 microsec/one execution generator expression: 785.3081048010291 microsec/one execution 

    … это примерно в 3 раза быстрее.

    range() в Python 2.x возвращает список:

     >>> range(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

    xrange() в Python 2.x возвращает итератор:

     >>> xrange(10) xrange(10) 

    А в Python 3 range() также возвращается итератор:

     >>> r = range(10) >>> iterator = r.__iter__() >>> iterator.__next__() 0 >>> iterator.__next__() 1 >>> iterator.__next__() 2 

    Поэтому ясно, что вы не можете объединять итераторы другими, используя chain() как указал другой парень.

    С помощью метода extend мы можем объединить два списка.

     >>> a = list(range(1,10)) >>> a.extend(range(100,105)) >>> a [1, 2, 3, 4, 5, 6, 7, 8, 9, 100, 101, 102, 103, 104] 

    Я пришел к этому вопросу, потому что пытался объединить неизвестное количество диапазонов, которые могли бы пересекаться, и не хотели повторять значения в конечном итераторе. Мое решение состояло в том, чтобы использовать set и union оператор следующим образом:

     range1 = range(1,4) range2 = range(2,6) concatenated = set.union(set(range1), set(range2) for i in concatenated: print(i) 
    Python - лучший язык программирования в мире.