2017-09-16 527 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安装。