展平由整数和列表组成的列表

时间:2014-04-08 09:19:47

标签: python list python-3.x integer flatten

假设输入:

[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,我完全是新手,如果有可能请告诉我如何手动定义它而不是使用内置函数,这意味着使用递归或迭代方法。多谢你们!!

5 个答案:

答案 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]
>>>