Группировка списков в списках в Python 3

У меня есть список списков строк:

List1 = [ ['John', 'Doe'], ['1','2','3'], ['Henry', 'Doe'], ['4','5','6'] ] 

То, что я хотел бы превратить в нечто подобное:

 List1 = [ [ ['John', 'Doe'], ['1','2','3'] ], [ ['Henry', 'Doe'], ['4','5','6'] ] ] 

Но, похоже, у меня проблемы с этим.

3 Solutions collect form web for “Группировка списков в списках в Python 3”

 List1 = [['John', 'Doe'], ['1','2','3'], ['Henry', 'Doe'], ['4','5','6'], ['Bob', 'Opoto'], ['10','11','12']] def pairing(iterable): it = iter(iterable) itn = it.next for x in it : yield (x,itn()) # The generator pairing(iterable) yields tuples: for tu in pairing(List1): print tu # produces: (['John', 'Doe'], ['1', '2', '3']) (['Henry', 'Doe'], ['4', '5', '6']) (['Bob', 'Opoto'], ['8', '9', '10']) # If you really want a yielding of lists: from itertools import imap # In Python 2. In Python 3, map is a generator for li in imap(list,pairing(List1)): print li # or defining pairing() precisely so: def pairing(iterable): it = iter(iterable) itn = it.next for x in it : yield [x,itn()] # produce [['John', 'Doe'], ['1', '2', '3']] [['Henry', 'Doe'], ['4', '5', '6']] [['Bob', 'Opoto'], ['8', '9', '10']] 

Изменить: определение функции генератора не требуется, вы можете выполнить сопряжение списка «на лету»:

 List1 = [['John', 'Doe'], ['1','2','3'], ['Henry', 'Doe'], ['4','5','6'], ['Bob', 'Opoto'], ['8','9','10']] it = iter(List1) itn = it.next List1 = [ [x,itn()] for x in it] 

Это должно делать то, что вы хотите, если хотите, чтобы вы всегда брали пары внутренних списков.

 list1 = [['John', 'Doe'], ['1','2','3'], ['Henry', 'Doe'], ['4','5','6']] output = [list(pair) for pair in zip(list1[::2], list1[1::2])] 

Он использует zip, который дает вам кортежи, но если вам это нужно точно так, как вы показали, в списках это понимает внешний список.

Здесь он находится в 8 строках. Я использовал кортежи, а не списки, потому что это «правильная» вещь:

 def pairUp(iterable): """ [1,2,3,4,5,6] -> [(1,2),(3,4),(5,6)] """ sequence = iter(iterable) for a in sequence: try: b = next(sequence) except StopIteration: raise Exception('tried to pair-up %s, but has odd number of items' % str(iterable)) yield (a,b) 

Демо-версия:

 >>> list(pairUp(range(0))) [] >>> list(pairUp(range(1))) Exception: tried to pair-up [0], but has odd number of items >>> list(pairUp(range(2))) [(0, 1)] >>> list(pairUp(range(3))) Exception: tried to pair-up [0, 1, 2], but has odd number of items >>> list(pairUp(range(4))) [(0, 1), (2, 3)] >>> list(pairUp(range(5))) Exception: tried to pair-up [0, 1, 2, 3, 4], but has odd number of items 

Конкретный метод:

 zip(sequence[::2], sequence[1::2]) # does not check for odd number of elements 
  • Почему hardcoding этот список медленнее, чем его вычисление?
  • Перемещение в произвольную позицию в файле в Python
  • Открыть файлы в режиме «рок-н-ролл»
  • Как справиться с сортировкой по регистру для выходных файлов?
  • Правильное использование глобальных переменных в Python 3
  • Добавление всех номеров из списка вместе (не суммирование). Python 3.3.2
  • составлять функцию и функциональный модуль
  • Почему этот код медленнее в Python 3?
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.