2014-04-08 32 views
2

假設輸入:壓扁其中包括整數,並列出清單

[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,我完全是一個新手,如果可能的話,請告訴我如何手動定義它而不是使用內置函數,意思是使用遞歸或迭代方法。多謝你們!!

+4

您意識到該鏈接也是重複的。如果你看一下,它也是至少4人的重複。它一直是重複的。 – ebarr

+0

你使用的是什麼python版本? – skamsie

+0

@Herr女演員嗨,我使用IDLE Python 3.3。 – Shawn

回答

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] 
+0

@Midnighter謝謝:) – thefourtheye

0

一個蟒蛇2. *只有解決辦法是使用ast模塊從compiler包(不再可用於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] 
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] 
0

在蟒蛇2.x中,您可以在compiler.ast模塊中使用flatten方法(」因爲棄用版本2.6:編譯器包已經在Python 3被移除「)如下:

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 
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] 
>>> 
+0

哈哈,我太新手瞭解你的第三步,謝謝你的方式:) – Shawn