如何在不分割字符串的情况下展平列表?
- 2025-04-10 09:45:00
- admin 原创
- 15
问题描述:
我想展平可能包含其他列表的列表,而无需拆分字符串。例如:
In [39]: list( itertools.chain(*["cat", ["dog","bird"]]) )
Out[39]: ['c', 'a', 't', 'dog', 'bird']
我想
['cat', 'dog', 'bird']
解决方案 1:
解决方案:
def flatten(foo):
for x in foo:
if hasattr(x, '__iter__') and not isinstance(x, str):
for y in flatten(x):
yield y
else:
yield x
Python 2.x 的旧版本:
def flatten(foo):
for x in foo:
if hasattr(x, '__iter__'):
for y in flatten(x):
yield y
else:
yield x
(在 Python 2.x 中,字符串实际上没有__iter__
属性,这与 Python 中几乎所有其他可迭代对象不同。但请注意,它们在 Python 3 中确实有属性,因此上述代码仅适用于 Python 2.x。)
解决方案 2:
对 orip 的答案进行轻微修改,避免创建中间列表:
import itertools
items = ['cat',['dog','bird']]
itertools.chain.from_iterable(itertools.repeat(x,1) if isinstance(x,str) else x for x in items)
解决方案 3:
一种蛮力的方法是将字符串包装在其自己的列表中,然后使用itertools.chain
>>> l = ["cat", ["dog","bird"]]
>>> l2 = [([x] if isinstance(x,str) else x) for x in l]
>>> list(itertools.chain(*l2))
['cat', 'dog', 'bird']
解决方案 4:
def squash(L):
if L==[]:
return []
elif type(L[0]) == type(""):
M = squash(L[1:])
M.insert(0, L[0])
return M
elif type(L[0]) == type([]):
M = squash(L[0])
M.append(squash(L[1:]))
return M
def flatten(L):
return [i for i in squash(L) if i!= []]
>> flatten(["cat", ["dog","bird"]])
['cat', 'dog', 'bird']
希望这有帮助
解决方案 5:
这是一个单行方法:
[item for sublist in [[item] if type(item) is not list else item for item in list1] for item in sublist]
解决方案 6:
使用库reduce
中的函数,functools
您可以这样做:
import functools
items = ['cat',['dog','bird']]
print(functools.reduce(lambda a, b: [a] + b, items))
解决方案 7:
适用于两层以上层次结构的 lambda 函数方法
>>> items = ['cat',['dog','bird',['fish']]]
>>> flatten = lambda y: [k for j in ([i] if not isinstance(i,list) else flatten(i) for i in y) for k in j]
>>> flatten(items)
['cat', 'dog', 'bird', 'fish']
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD