2016-11-07 130 views
1

如果我有這樣的輸入(1, 2, 3, 4, 5, 6) 輸出必須是... [[1, 2], [3, 4], [5, 6]]python3.2)在列表中追加兩個元素(列表中的列表)

我知道如何處理,如果它是一個元素,但不是兩個。

x=[] 
for number in numbers: 
    x.append([number]) 

我會感謝您的任何幫助!

+0

另外我想從輸出轉換我想花括號。 {1,2,3,4,5,6}如果有可能,你可以給我建議,以獲得一個通用的代碼,不僅適用於兩個分組,但3組。 [[1,2,3],[4,5,6]]謝謝! – meme

+0

oneliner:'''list(zip(a [:: 2],a [1 :: 2]))'''。通過將其包裝到一個採用窗口/組大小並在組範圍內循環的函數中,可以很容易地使其具有通用性。 – TrigonaMinima

回答

1

像這樣的工作:

out = [] 
lst = (1,2,3,4,5,6,7,8,9,10) 
for x in range(len(lst)): 
    if x % 2 == 0: 
     out.append([lst[x], lst[x+1]]) 
    else: 
     continue 

要使用此功能,只需設置lst等於你想要的數字無論列表。最終產品儲存在out中。

1

你可以使用這樣的東西。該解決方案還適用於奇數長度的名單

def func(lst): 
    res = [] 
    # Go through every 2nd value | 0, 2, 4, ... 
    for i in range(0, len(lst), 2): 
     # Append a slice of the list, + 2 to include the next value 
     res.append(lst[i : i + 2]) 

    return res 

# Output 
>>> lst = [1, 2, 3, 4, 5, 6] 
>>> func(lst) 
[[1, 2], [3, 4], [5, 6]] 
>>> lst2 = [1, 2, 3, 4, 5, 6, 7] 
>>> func(lst2) 
[[1, 2], [3, 4], [5, 6], [7]] 

列表解析解

def func(lst): 
    return [lst[i:i+2] for i in range(0, len(lst), 2)] 

切片在這種情況下更好,因爲你沒有考慮到IndexError允許它爲奇數長度爲工作好。

如果你想要的話,你還可以添加另一個參數,讓你指定所需的內部元素數量。

def func(lst, size = 2): # default of 2 it none specified 
    return [lst[i:i+size] for i in range(0, len(lst), size)] 
0

這個問題有幾個障礙。你想遍歷列表而不會超過列表的末尾,並且你需要處理列表有奇數長度的情況。下面是一個可行的解決方案:

def foo(lst): 
    result = [[x,y] for [x,y] in zip(lst[0::2], lst[1::2])] 
    return result 

如果這看起來令人費解,讓我們分解代碼。

  • 指數切片: lst[0::2]遍歷lst通過起始於第一元件(俗稱第二元件),起始於的2.同樣lst[1::2]迭代增量第0個元素並且前進,並繼續以2爲增量。 實施例:

    >>> lst = (1,2,3,4,5,6,7) 
    >>> print(lst[0::2]) 
    (1,3,5,7) 
    >>> print(lst[1::2]) 
    (2,4,6) 
    
  • ZIP:zip()需要兩個列表(或就此而言的任何迭代的對象),並返回包含的元組列表。例如:

    >>> lst1 = (10,20,30, 40) 
    >>> lst2 = (15,25,35) 
    >>> prit(zip(lst1, lst2)) 
    [(10,15), (20,25), (30,35)] 
    

    注意zip(lst1, lst2)有很好的屬性,如果它的參數之一是比其他,zip()停止荏苒,只要長最短可迭代超出項目。

  • 列表理解:python允許一般的迭代。考慮聲明:

    >>> [[x,y] for [x,y] in zip(lst1,lst2)] 
    

    內部位「for [x,y] in zip(lst1,lst2)」說:「通過對所有在拉鍊值的迭代,並給它們的值x和y」。在聲明 「[[x,y] for [x,y] ...]」的其餘部分中,它表示「對於x和y的每組值,使列表[x,y]存儲在更大的列表中」。一旦這個語句的執行,你有名單,其中內部列表是對所有可能的zip(lst1,lst2)

1

有你想要的東西做的更短的方式列表:

result = [] 
L = (1,2,3,4,5,6,7,8,9,10) 
result = [[L[i], L[i + 1]] for i in range(0, len(L) - 1, 2)] 
print(result) 
0

非常明確的解決方案:

l = (1, 2, 3, 4, 5, 6) 
l = iter(l) 
w = [] 
for i in l: 
    sub = [] 
    sub.append(i)  
    sub.append(next(l)) 
    w.append(sub)  
print w 
+0

這不起作用。至少對於Python 3(還沒有嘗試過2)。目前還不清楚,我真的不明白你想做什麼。 –

+0

這工作(試用2.6)。去嘗試一下 ! 下一個方法是迭代集合的關鍵。 。輸入:(1,2,3,4,5,6) 輸出:[[1,2],[3,4],[5,6]] l =(1,2,3,4,5,6) 4,5,6) 打印升 升= ITER(升) W = [] 對於i在升: 子= [] sub.append(ⅰ) sub.append(l.next()) w.append(sub) print w – anati

+0

這個標籤是用於python 3的,所以你需要改成'sub.append(next(l))' –