поочередно добавляя элементы из двух списков

У меня есть три списка с элементами:

a = [[0,1],[2,3],...] b = [[5,6],[7,8],...] c = [] 

Я хочу добавить элементы из a и b в c, чтобы получить:

 c = [ [0,1],[5,6],[2,3],[7,8],.... ] 

7 Solutions collect form web for “поочередно добавляя элементы из двух списков”

Еще один очень простой подход с использованием строкового срезабольшей эффективности ):

 >>> a = [[0,1],[2,3]] >>> b = [[5,6],[7,8]] >>> c = a + b # create a list with size = len(a) + len(b) >>> c[::2], c[1::2] = a, b # alternately insert the value >>> c [[0, 1], [5, 6], [2, 3], [7, 8]] 

Ниже приведено сравнение результатов с timeit для ответов, упомянутых здесь (версия Python: 2.7):

  1. Использование нарезки строк : 0.586 usec за цикл

     moin@moin-pc:~$ python -m "timeit" -s "a = [[0,1],[2,3]]; b = [[5,6],[7,8]];" "c = a + b; c[::2], c[1::2] = a, b" 1000000 loops, best of 3: 0.586 usec per loop 
  2. Использование itertools.chain() : 1.89 usec за цикл

     moin@moin-pc:~$ python -m "timeit" -s "from itertools import chain; a = [[0,1],[2,3]]; b = [[5,6],[7,8]];" "c = list(chain(*zip(a, b)))" 1000000 loops, best of 3: 1.89 usec per loop 
  3. Использование reduce() : 0.829 usec за цикл

     moin@moin-pc:~$ python -m "timeit" -s "import operator; a = [[0,1],[2,3]]; b = [[5,6],[7,8]];" "c = reduce(operator.concat, zip(a, b))" 1000000 loops, best of 3: 0.829 usec per loop 
  4. Использование list.extend() : list.extend() за цикл

      moin@moin-pc:~$ python -m "timeit" -s "a = [[0,1],[2,3]]; b = [[5,6],[7,8]]; c=[]" "for pair in zip(a,b): c.extend(pair)" 1000000 loops, best of 3: 0.824 usec per loop 
  5. Использование list.append() дважды: 1.04 usec за цикл

     moin@moin-pc:~$ python -m "timeit" -s "a = [[0,1],[2,3]]; b = [[5,6],[7,8]]; c=[]" "for a_element, b_element in zip(a, b): c.append(a_element); c.append(b_element)" 1000000 loops, best of 3: 1.04 usec per loop 

Основной подход:

 >>> a = [[0,1],[2,3]] >>> b = [[5,6],[7,8]] >>> c = [] >>> for pair in zip(a,b): ... c.extend(pair) ... >>> c [[0, 1], [5, 6], [2, 3], [7, 8]] >>> 

Это ломается, если длины не равны. Но вы можете заниматься этим делом в качестве упражнения.

Вы можете zip два списка, а затем свести их к плоскому списку:

 import operator c = reduce(operator.concat, zip(a, b)) 

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

 from itertools import chain a = [[0,1],[2,3],[10,11],[12,13]] b = [[5,6],[7,8],[15,16],[17,18]] c = [*chain(*zip(a, b))] print(c) 

вывод

 [[0, 1], [5, 6], [2, 3], [7, 8], [10, 11], [15, 16], [12, 13], [17, 18]] 

Как отмечает juanpa.arrivillaga в комментариях, этот синтаксис не будет работать на более старых версиях Python. Вместо этого вы можете сделать

 c = list(chain(*zip(a, b))) 

Вот еще один вариант, который не использует импорт или оператор * splat:

 c = [u for t in zip(a, b) for u in t] 

Если вам нужно обрабатывать входные списки неравной длины, взгляните на функцию roundrobin в Itertools Recipes . Например,

 c = list(roundrobin(a, b)) 

Рассматривать:

 merged = [] for a_element, b_element in zip(a, b): merged.append(a_element) merged.append(b_element) 

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

Использование more_itertools которое реализует рецепт itertools roundrobin

 >>> from more_itertools import roundrobin >>> a = [[0,1],[2,3]] >>> b = [[5,6],[7,8]] >>> list(roundrobin(a, b)) [[0, 1], [5, 6], [2, 3], [7, 8]] 

Предполагая len (a) == len (b), и вы добавляете их поочередно по очереди:

 for i in range(len(a)): c.append(a[i]) c.append(b[i]) 

Однако я бы рекомендовал использовать c = deque() . Поскольку deques намного быстрее, если вы делаете много добавок.

  • выбор элементов из списка в соответствии с их метками в другом списке
  • Python - просмотр списка с несколькими аргументами в
  • Python 2: различное значение ключевого слова «in» для наборов и списков
  • Найти ближайшие индексы для одного массива против всех значений в другом массиве - Python / NumPy
  • Сохранение результата Minhash
  • Вложенный список и счетчик ()
  • Преобразование списка в строку с помощью python
  • Python: сравнение списков
  • Python - лучший язык программирования в мире.