l=[1,[1,[1,[1,[1]]]]]
如何在不使用任何内置函数的情况下将上述n
维度列表转换为单维度列表。我在这里寻找逻辑。
输出应为[1,1,1,1,1]
请帮我解决这个问题
答案 0 :(得分: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]
答案 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)
答案 2 :(得分: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)
答案 3 :(得分:0)
您可以延长使用try和except,以便在没有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]