How to flatten only one sub list of list of lists

Peter Otten __peter__ at web.de
Wed Mar 1 02:41:06 EST 2017


Sayth Renshaw wrote:

> How can I flatten just a specific sublist of each list in a list of lists?
> 
> So if I had this data
> 
> 
> [   ['46295', 'Montauk', '3', '60', '85', ['19', '5', '1', '0
> [   [$277790.00']],
>     ['46295', 'Dark Eyes', '5', '59', '83', ['6', '4', '1', '0
>     [$105625.00']], '46295', 'Machinegun Jubs', '6', '53', '77', ['6',
>     ['2', '1', '1 $71685.00']], '46295', 'Zara Bay', '1', '53', '77',
>     [['12', '2', '3', '3 $112645.00']]]
> 
> 
> How can I make it be
> 
> 
> [   ['46295', 'Montauk', '3', '60', '85', '19', '5', '1', '0 $277790.00'],
>     ['46295', 'Dark Eyes', '5', '59', '83', '6', '4', '1', '0
>     [$105625.00'], '46295', 'Machinegun Jubs', '6', '53', '77', '6', '2',
>     ['1', '1 $71685.00'], '46295', 'Zara Bay', '1', '53', '77', '12', '2',
>     ['3', '3 $112645.00']]
> 
> Been looking around but most solutions just entirely flatten everything.
> This was popular on SO but yeah it flattens everything  I want to be more
> selective
> 
> def flatten(lst):
>     for elem in lst:
>         if type(elem) in (tuple, list):
>             for i in flatten(elem):
>                 yield i
>         else:
>             yield elem
> 
> What I am thinking is that if for each list the sublist should be at index
> 1, so
> 
> [0][1]
> [1][1]
> [2][1]
> 
> for item in list:
>     item[1] - somehow flatten.
> 
> Thoughts?

Replace the slice row[index:index+1] with row[index], either by building a new list or in place:

>>> def show(data):
...    for item in data: print(item)
... 
>>> def flatten_one(rows, index):
...     return [r[:index] + r[index] + r[index+1:] for r in rows]
... 
>>> show(data)
['46295', 'Montauk', '3', '60', '85', ['19', '5', '1', '0 $277790.00']]
['46295', 'Dark Eyes', '5', '59', '83', ['6', '4', '1', '0 $105625.00']]
['46295', 'Machinegun Jubs', '6', '53', '77', ['6', '2', '1', '1 $71685.00']]
['46295', 'Zara Bay', '1', '53', '77', ['12', '2', '3', '3 $112645.00']]
>>> show(flatten_one(data, 5))
['46295', 'Montauk', '3', '60', '85', '19', '5', '1', '0 $277790.00']
['46295', 'Dark Eyes', '5', '59', '83', '6', '4', '1', '0 $105625.00']
['46295', 'Machinegun Jubs', '6', '53', '77', '6', '2', '1', '1 $71685.00']
['46295', 'Zara Bay', '1', '53', '77', '12', '2', '3', '3 $112645.00']
>>> def flatten_inplace(rows, index):
...     for row in rows:
...         row[index:index+1] = row[index]
... 
>>> flatten_inplace(data, 5)
>>> show(data)
['46295', 'Montauk', '3', '60', '85', '19', '5', '1', '0 $277790.00']
['46295', 'Dark Eyes', '5', '59', '83', '6', '4', '1', '0 $105625.00']
['46295', 'Machinegun Jubs', '6', '53', '77', '6', '2', '1', '1 $71685.00']
['46295', 'Zara Bay', '1', '53', '77', '12', '2', '3', '3 $112645.00']





More information about the Python-list mailing list