价: python decompose a list Flattening a shallow list in Python
虽然上面提到的解决方案很有帮助,但我的问题略有不同,我想知道是否有一种pythonic方法来解决它。
a = [['a-3','b-3'],'r',['j']]
我想要的是一种让'a'等于以下内容的简洁方法:
a = ['a-3','b-3','r','j']
我被困在使用python 2.4所以2.4兼容的pythonic解决方案会很棒,但我仍然会发现2.7个以上的例子很有趣。
主要问题是存在不可迭代的元素,否则sum(lst,[])的效果非常好,2.7 +的链式方法
答案 0 :(得分:5)
Pythonic解决方案可能意味着许多事情。考虑到readability counts
(PEP 20),这是我对该主题的贡献:
def dec(input_, output_):
if type(input_) is list:
for subitem in input_:
dec(subitem, output_)
else:
output_.append(input_)
示例:
input_ = [['a-3','b-3', ['x','hello', ['3','b']]],'r',['j']]
output_ = ['a-3', 'b-3', 'x', 'hello', '3', 'b', 'r', 'j']
答案 1 :(得分:2)
怎么样:
itertools.chain.from_iterable(map(lambda i: i if type(i) == list else [i], a))
或者,为了便于阅读:
def assure_is_list(a):
return a if type(a) == list else [a]
itertools.chain.from_iterable(map(assure_is_list, a))
答案 2 :(得分:1)
def flatten(L):
if not L:
return L
elif type(L[0]) == type([]):
return flatten(L[0]) + flatten(L[1:])
else:
return [L[0]] + flatten(L[1:])
希望这有帮助
答案 3 :(得分:0)
任何可迭代类型的递归展平,除了单独留下字符串(因为你可能不想将它们分成字符):
def flatten(x):
try:
if isinstance(x, basestring): raise TypeError
y = iter(x)
except TypeError:
yield x
return
for item in y:
for subitem in flatten(item):
yield subitem
答案 4 :(得分:0)
认为你也可以使用这样的东西:
data = [['a-3','b-3', ['x','hello', ['3','b']]],'r',['j']]
while not all(not isinstance(x, list) for x in data):
for i in xrange(len(data)):
value = data.pop(i)
if isinstance(value, list):
data.extend(value)
else:
data.append(value)