2017-09-16 4 views
1
I/P - (('1', (('2355', '5'), 'F')), 
     ('1', (('2300', '4'), 'M')), 
     ('1', (('2400', '5'), 'F'))) 
O/P - [['1','2355','5','F'], 
     ['1','2300','4','M'], 
     ['1','2400','5','F']] 

Ich bin in der Lage das erste Element zu erhalten, aber die anderen Elemente sind nach wie vor als ein Tupel extrahiert, während ich sie alle wollen von einer Liste als Teil zu kommen. Grundsätzlich möchte ich, dass jedes Element einzeln als Teil einer Liste herauskommt.Convert Tupeln verschachtelte Listen verschachtelt

Antwort

0
def flaten(t,level=0): 
    l = [] 
    for t1 in t: 
    if type(t1) is tuple: 
     if level == 0: 
     l.append(flaten(t1,level+1)) 
     else: 
     l.extend(flaten(t1,level+1)) 
    else: 
     l.append(t1) 
    return l 

t = (('1', (('2355', '5'), 'F')), ('1', (('2300', '4'), 'M')), ('1', (('2400', '5'), 'F'))) 
l = flaten(t) 
print(l) 
1

in 3.3+ eine rekursive Idiom ist, die modifiziert werden können verschachtelt Tupel ‚beliebig‘ Tiefe abzuflachen (siehe: System Rekursion Grenze)

def yielder(x): 
    for y in x: 
     if isinstance(y, tuple): 
      yield from yielder(y) 
     else: 
      yield y 

, die dann in einer Liste verwendet werden können,

Verständnis
[[*yielder(e)] for e in IP] 
Out[48]: [['1', '2355', '5', 'F'], ['1', '2300', '4', 'M'], ['1', '2400', '5', 'F']] 

fand ich die oben bei der Suche nach 'python abflachen', in den Kommentaren zu https://jugad2.blogspot.in/2014/10/flattening-arbitrarily-nested-list-in.html

für 2/7 http://joedicastro.com/aplanar-listas-en-python.html Rezepte hat, ich modded:

def flat_slice (lst): 
    lst = list (lst) 
    for i , _ in enumerate (lst): 
     while (hasattr (lst [ i ], "__iter__") and not isinstance (lst [ i ], basestring)): 
      lst [ i : i + 1 ] = lst [ i ] 
    return lst 

(ich hatte basestring zu ändern für 3+ auf str)

und es lief mit dem gleichen Ergebnis

[[*flat_slice(e)] for e in IP] 
Out[66]: [['1', '2355', '5', 'F'], ['1', '2300', '4', 'M'], ['1', '2400', '5', 'F']] 
+0

Gibt es einen anderen Weg? Ich benutze Python 2.7 und kann nicht upgraden. – rAmAnA

+0

Sie sollten die Version in die Tags einfügen, wenn ti wichtig ist. Denn sonst ist das eine sehr glatte Antwort. – RobertB

0

I behielt es zu einer einfachen rekursiven Routine, die auch in einem Verständnis verwendet werden kann:

Ausgabe:

[['1', '2355', '5', 'F'], ['1', '2300', '4', 'M'], ['1', '2400', '5', 'F']] 
0

Iterate jeder abzählbaren, alle Elemente abzuflachen, Neufassung dann die iterable auf eine Liste. Hier sind zwei Ansätze:

Gegeben

iterables = (
    ('1', (('2355', '5'), 'F')), 
    ('1', (('2300', '4'), 'M')), 
    ('1', (('2400', '5'), 'F')) 
) 

expected = [ 
    ['1','2355','5','F'], 
    ['1','2300','4','M'], 
    ['1','2400','5','F'] 
] 

-Code

Eine modifizierte flatten von this post (Python 3.2-kompatibel):

# Approach 1 
from collections import Iterable 


def flatten(items): 
    """Yield items from any nested iterable""" 
    for x in items: 
     if isinstance(x, Iterable) and not isinstance(x, (str, bytes)): 
      for i in flatten(x): 
       yield i 
     else: 
      yield x 

actual = [list(flatten(i)) for i in iterables] 
assert actual == expected 

Für eine ein- Liner, betrachten more_itertools.collapse, ein Werkzeug, das auch verschachtelte Iterables flacht:

# Approach 2 
import more_itertools as mit 


actual = [list(mit.collapse(i)) for i in iterables] 
assert actual == expected 

Hinweis: more_itertools ist ein Third-Party-Bibliothek, die mehrere itertools recipes und nützliche Tools implementiert. Installieren von pip install more_itertools.