2017-04-18 39 views
-5

l=[1,[1,[1,[1,[1]]]]]如何使用任何内置函数将n维列表转换为单维列表python wothout?

如何上面n维度列表为单一尺寸列表转换,而无需使用任何内置的功能。我在这里寻找逻辑。

输出应为[1,1,1,1,1]

请帮我在这

+0

[转换多维列表到1D列表在Python](可能的复制http://stackoverflow.com/questions/2961983/convert-multi-dimensional-list-to-a-1d-list在python) – direprobs

+1

这是一种代码高尔夫 – maxkoryukov

+1

direprobs链接中的任何答案都可以帮助你吗?这听起来像是作业,所以你真的应该告诉我们你试过的东西。不使用内置函数做这件事并不容易。是否允许像'isinstance','type'或'len'这样的函数?怎么样的列表方法像'.append'或'.extend'? –

回答

1

试试这个,

l = [1,[1,[1,[1,[1]]]]] 
def getAsList(l): 
    r =[] 
    for i in l: 
     if type(i) == list: 
      r.extend(getAsList(i)) 
     else: 
      r.append(i) 
    return r 


print getAsList(l) 
+2

不要使用'=='进行类型验证。而是使用'is'。 – Kasramvd

+2

你可以替换,如果输入(i)==列表if isinstance(i,list) – decadenza

2

使用递归函数:

In [20]: def ravel(lst): 
      for i in lst: 
       if isinstance(i, list): #use 'type(i) is list' if you don't want built-in functions 
        yield from ravel(i) 
       else: 
        yield i 
    ....:     

In [21]: list(ravel(l)) 
Out[21]: [1, 1, 1, 1, 1] 
+0

'isinstance'是内置的... –

+0

@ juanpa.arrivillaga是的,只是更新;) – Kasramvd

+0

'''也是一个内置的;) –

0

你可以舒展的使用尝试和除了为了完成这个没有isinstance

In [44]: def flatten(l, r): 
    ...:  for i in l: 
    ...:   try: 
    ...:   i.count 
    ...:   flatten(i, r) 
    ...:   except: 
    ...:    r.append(i) 
In [46]: l=[1,[1,[1,[1,[1]]]]] 
In [47]: r = [] 
In [48]: flatten(l,r) 
In [49]: r 
Out[49]: [1, 1, 1, 1, 1] 
2

下面是不使用任何内置函数Python 2里的解决方案。

与其他解决方案一样,我们使用递归。如果当前项目是一个列表,我们就会把它列入其中,从而产生先前递归级别的任何解决方案。否则,我们只是产生该项目。

def flatten(seq): 
    for u in seq: 
     try: 
      for v in flatten(u): 
       yield v 
     except TypeError: 
      yield u 

l = [1, [2, [3, [4, [5]]]]] 
flat = [u for u in flatten(l)]  
print flat 

输出

[1, 2, 3, 4, 5] 

当然,使用Python没有任何其内置的功能是愚蠢的,除非它是一个编程的难题。明智的办法做到这一点是:

def flatten(seq): 
    for u in seq: 
     if isinstance(u, list): 
      for v in flatten(u): 
       yield v 
     else: 
      yield u 

l = [1, [2, [3, [4, [5]]]]] 
flat = list(flatten(l)) 

在Python 3,你可以使用yield from语法,如图Kasramvd的答案。

def flatten(seq): 
    for u in seq: 
     if isinstance(u, list): 
      yield from flatten(u) 
     else: 
      yield u 

l = [1, [2, [3, [4, [5]]]]] 
flat = list(flatten(l)) 
print(flat) 
相关问题