2017-09-16 526 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']] 

我能夠得到的第一要素,但其他要素仍然提取作爲一個元組,而我希望所有的人都出來作爲一個列表的一部分。基本上,我希望每個元素都作爲列表的一部分單獨出來。轉換嵌套的元組嵌套的列表

回答

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

在3.3+有一個遞歸成語,可以進行修改,以弄平「任意」深度的嵌套結構(參見:系統遞歸限制)

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

然後可以在列表中使用理解

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

我發現上面通過搜索「蟒蛇扁平化」,在評論https://jugad2.blogspot.in/2014/10/flattening-arbitrarily-nested-list-in.html

爲2/7 http://joedicastro.com/aplanar-listas-en-python.html有食譜,我改裝成:

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 

(我不得不改變即basestring爲str爲3+)

,並具有相同的結果

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

還有其他方法嗎?我正在使用Python 2.7並且無法升級。 – rAmAnA

+0

如果ti很重要,您應該將版本放在標籤中。否則,這是一個非常光滑的答案。 – RobertB

0

我跑它保持在一個簡單的遞歸例程,也可以在一個修真使用:

def unpack(element, stack): 
    if isinstance(element, basestring): 
     stack.append(element) 
    else: 
     for i in element: 
      unpack(i, stack) 
    return stack 

[unpack(row, []) for row in IP] 

輸出:

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

迭代每個迭代,展平所有元素,然後將迭代器重新迭代到列表中。這裏有兩種方法:

鑑於

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

代碼

一種改性flattenthis post(Python的2/3尺寸):

# 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 

對於一維班輪,考慮more_itertools.collapse,一個工具也變平嵌套iterables:

# Approach 2 
import more_itertools as mit 


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

注:more_itertools是一個第三方庫,實現了幾個itertools recipes和有用的工具。由pip install more_itertools安裝。