假设输入:
[1, [3, 6], 9, [2, [1, 3]], [4, [1], 5], [6], 1, [[2]]]
预期产出:
[1,1,1,1,2,2,3,3,4,5,6,6,9]
如何在不删除重复项的情况下展平列表?
我目前的情况
def flatten(lst):
nlist = []
for item in lst:
nlist = nlist + [item]
return nlist
我最初的想法是将元素重新添加到新列表中以获得预期的输出。然而它没有顺利,我正在
我得到了什么:
[1, [3, 6], 9, [2, [1, 3]], [4, [1], 5], [6], 1, [[2]]]
我正在使用IDLE 3.3,我完全是新手,如果有可能请告诉我如何手动定义它而不是使用内置函数,这意味着使用递归或迭代方法。多谢你们!!
答案 0 :(得分:2)
您可以像这样递归展平数据
>>> def rec(current_item):
... if type(current_item) == list:
... for items in current_item:
... for item in rec(items):
... yield item
... elif type(current_item) == int:
... yield current_item
然后按照这样排序
>>> sorted(rec([1, [3, 6], 9, [2, [1, 3]], [4, [1], 5], [6], 1, [[2]]]))
[1, 1, 1, 1, 2, 2, 3, 3, 4, 5, 6, 6, 9]
答案 1 :(得分:1)
从 funcy 模块(https://github.com/Suor/funcy),您可以选择展平功能。
在这种情况下,如果主机上有funcy,则以下代码应按预期工作:
from funcy import flatten
nlist = [1, [3, 6], 9, [2, [1, 3]], [4, [1], 5], [6], 1, [[2]]]
flat_list = flatten(nlist)
print(nlist)
# [1, [3, 6], 9, [2, [1, 3]], [4, [1], 5], [6], 1, [[2]]]
print(sorted(flat_list))
# [1, 1, 1, 1, 2, 2, 3, 3, 4, 5, 6, 6, 9]
答案 2 :(得分:0)
python 2. * only 解决方案将使用compiler包中的ast
模块(不再在python 3中提供)。它非常适合这个特例:
import compiler
a = [1, [3, 6], 9, [2, [1, 3]], [4, [1], 5], [6], 1, [[2]]]
print sorted(compiler.ast.flatten(a))
# [1, 1, 1, 1, 2, 2, 3, 3, 4, 5, 6, 6, 9]
答案 3 :(得分:0)
在python 2.x中,你可以在compiler.ast
模块中使用flatten
方法("自2.6版以来不推荐使用:在Python 3中删除了编译器包。&#34 ;)如下:
from compiler.ast import flatten
l = [1, [3, 6], 9, [2, [1, 3]], [4, [1], 5], [6], 1, [[2]]]
flattened = flatten(l)
sorted_list = sorted(flattened)
在python 3中,为了展平任意嵌套列表,您可以使用以下代码,如here所述:
def flatten(l):
result = []
for element in l:
if hasattr(element, "__iter__") and not isinstance(element, str):
result.extend(flatten(element))
else:
result.append(element)
return result
答案 4 :(得分:0)
如何使用正则表达式?
>>> import re
>>> l = [1, [3, 6], 9, [2, [1, 3]], [4, [1], 5], [6], 1, [[2]]]
>>> l2 = map(int,re.sub('[\[\]\s]','',str(l)).split(','))
>>> l2.sort()
>>> l2
[1, 1, 1, 1, 2, 2, 3, 3, 4, 5, 6, 6, 9]
>>>