2014-04-02 26 views
17

Potrzebuję pomocy w ustaleniu, jak obejść usuwanie "kolumny" z zagnieżdżonej listy, aby ją zmodyfikować.Usuwanie kolumny z zagnieżdżonej listy w Pythonie

Say mam

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

i chcę usunąć drugą kolumnę (tak ceni 2,6,1), aby uzyskać:

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

utknąłem z jak zmodyfikować lista z tylko wyjęciem kolumny. Zrobiłem coś takiego wcześniej? Oprócz tego, że drukowaliśmy to zamiast tego i oczywiście nie działałoby w tym przypadku, ponieważ uważam, że przerwanie konfliktów z resztą wartości, które chcę na liście.

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 

Jak zmodyfikować listę zagnieżdżoną? Czy mój umysł jest we właściwym miejscu, porównując go do kodu, który napisałem, czy to wymaga czegoś innego?

Odpowiedz

11

można po prostu usunąć odpowiedni element z każdego wiersza przy użyciu 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

Ok, więc oczywiście mam jeszcze dużo do wydostać się z pytona; czym właściwie jest "rząd"? Czy jest to coś, co jest wbudowane w python? Nigdy go nie używałem przed – Crisis

+1

@ Cris Wszystko, co tutaj robimy, to pętla nad listą 'L'. Przypisujemy zmiennej (arbitralnie nazwanej) 'row' do każdego elementu' L' (tj. Każdej listy zagnieżdżonej). Następnie usuwamy element 'row' używając' del'.Możesz przeczytać o podstawach Pythona, takich jak pętle for. – arshajii

+0

@arashajii Oh ok ok, dobrze, myślę, że rozumiem. Mój instruktor nie chce, żebyśmy używali For-loopów, więc nie byłem tego pewien. Dziękuję Ci. – Crisis

5

Jeśli chcesz ekstraktu że kolumny do późniejszego wykorzystania, podczas wyjmowania go z oryginalnej listy, należy użyć wyrażeń listowych z 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]] 

w przeciwnym razie po prostu pętla na liście i usunąć pola, które nie są już potrzebne, jak w arshajii's answer

2

Oto jeden ze sposobów aktualizacji poradnika Kojiro.

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

Można uogólnić to, aby usunąć kolumnę:

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

Możesz chcieć mieć 'L [:]' na LHS tego wyrażenia, aby zastąpić listę na miejscu. – kojiro

+0

@kojiro: Doskonała porada. –

3

Można użyć operator.itemgetter, który jest tworzony w tym samym celu.

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

Można go używać w wykazie zrozumienia jak to

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

Można również użyć zagnieżdżonego zrozumieniem listy, w których pominięcie elementów, jeśli indeks jest 1, tak

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

Uwaga: Wszystkie sugerowane w tej odpowiedzi odpowiedzi nie mają wpływu na oryginalną listę. Będą generować nowe listy bez niepożądanych elementów.

4

Zastosowanie map-lambda:

print map(lambda x: x[:1]+x[2:], L) 
Powiązane problemy