Grouping lists within lists in Python 3

By : Tal
Source: Stackoverflow.com
Question!

I have a list of lists of strings like so:

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

That I would like to turn into something like this:

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

But I seem to be having trouble doing so.

By : Tal


Answers

Here it is in 8 lines. I used tuples rather than lists because it's the "correct" thing to do:

def pairUp(iterable):
    """
        [1,2,3,4,5,6] -


This should do what you want assuming you always want to take pairs of the inner lists together.

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

It uses zip, which gives you tuples, but if you need it exactly as you've shown, in lists, the outer list comprehension does that.

By : recursive


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']]

Edit: Defining a generator function isn't required, you can do the pairing of a list on the fly:

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]
By : eyquem


This video can help you solving your question :)
By: admin