2014-04-02 99 views
17

我需要幫助瞭解如何解決從嵌套列表中刪除「列」以對其進行修改的問題。從Python中的嵌套列表中刪除列

說我有

L = [[1,2,3,4], 
    [5,6,7,8], 
    [9,1,2,3]] 

,我想刪除第二列(所以值2,6,1),以獲得:

L = [[1,3,4], 
    [5,7,8], 
    [9,2,3]] 

我堅持着如何修改只列出一列。我以前做過這樣的事情?除了我們正在打印它,當然它不會在這種情況下工作,因爲我認爲中斷與我想要在列表中的其餘值的衝突。

def L_break(L): 

i = 0 
while i < len(L): 
    k = 0 
    while k < len(L[i]): 
     print(L[i][k] , end = " ") 
     if k == 1: 
      break 
     k = k + 1 
    print() 
    i = i + 1 

那麼,你將如何去修改這個嵌套列表? 我是否在正確的地方將它與我發佈的代碼進行比較,或者這需要不同的東西?

回答

11

可以使用del簡單地刪除每一行適當的元素:

L = [[1,2,3,4], 
    [5,6,7,8], 
    [9,1,2,3]] 

for row in L: 
    del row[1] # 0 for column 1, 1 for column 2, etc. 

print L 
# outputs [[1, 3, 4], [5, 7, 8], [9, 2, 3]] 
+0

好了,所以顯然我還有很多要走出蟒蛇的; 「行」究竟是什麼?比如,它是用python構建的嗎?我從來沒有用過它 – Crisis

+1

@Crisis我們這裏所做的就是在'L'列表上循環。我們將變量(任意命名)'row'分配給'L'的每個元素(即每個嵌套列表)。然後,我們用'del'刪除'row'的一個元素。您可能想了解Python基礎知識,例如for循環。 – arshajii

+0

@arashajii噢好吧,對,我想我明白了。我的導師不希望我們使用For-loops,所以我不確定。謝謝。 – Crisis

5

如果你想提取供以後使用該列,而從原來的列表中刪除,請使用列表理解pop

>>> L = [[1,2,3,4], 
...  [5,6,7,8], 
...  [9,1,2,3]] 
>>> 
>>> [r.pop(1) for r in L] 
[2, 6, 1] 
>>> L 
[[1, 3, 4], [5, 7, 8], [9, 2, 3]] 

否則,在這裏僅列出循環和刪除不再需要的字段,如arshajii's answer

2

這是一種方法,更新爲接受小二的建議。

>>> L[:] = [i[:1]+i[2:] for i in L] 
>>> L 
[[1, 3, 4], [5, 7, 8], [9, 2, 3]] 

可以概括這個刪除任何列:

def remove_column(matrix, column): 
    return [row[:column] + row[column+1:] for row in matrix] 

# Remove 2nd column 
copyofL = remove_column(L, 1) # Column is zero-base, so, 1=second column 
+0

您可能希望在該表達式的LHS上具有'L [:]'來就地替換列表。 – kojiro

+0

@kojiro:非常好的建議。 –

3

您可以使用operator.itemgetter,這是出於這個目的而創建的。

from operator import itemgetter 
getter = itemgetter(0, 2, 3)   # Only indexes which are needed 
print(list(map(list, map(getter, L)))) 
# [[1, 3, 4], [5, 7, 8], [9, 2, 3]] 

可以在列表理解這樣使用它

print([list(getter(item)) for item in L]) 
# [[1, 3, 4], [5, 7, 8], [9, 2, 3]] 

您也可以使用嵌套列表理解,在此我們忽略的元素,如果該指數爲1,這樣

print([[item for index, item in enumerate(items) if index != 1] for items in L]) 
# [[1, 3, 4], [5, 7, 8], [9, 2, 3]] 

注意:在這個答案中建議的所有這些不會影響原始列表。他們將生成新的列表,而不會產生不需要的元素。

4

使用map-lambda

print map(lambda x: x[:1]+x[2:], L)