1 svar
266 visningar
fast_and_the_curious behöver inte mer hjälp
fast_and_the_curious 1
Postad: 7 jan 2022 22:22

Radera listor ur en nästlad lista

Hej!

Jag har ett program där jag ska radera objekt från olika listor i en matris. Tillslut blir några listor i matrisen tomma och då skulle jag vilja ta bort de, dock verkar det inte gå när jag använder del. Har försökt andra metoder men hur jag än försöker blir output:en [ ['**', '12'], [], [], [], [], [] ] och inte [['**', '12']]. Finns det några sätt att radera listor i en matris? :/

Koden:


#Funktionen chomp som tar bort den del av matrisen från angiven rad samt kolumn i parameterlistan
def chomp(matris, antal_rad, antal_kolumn) : 

    for i in range(len(matris) - antal_rad): 
        del matris[antal_rad + i][antal_kolumn:] #går igenom alla listor och tar bort tal från och med angivet indexnummer av användaren                   

    for i in matris:                            # går igenom varje lista
        if len(i) == 0: 
            print('the list is empty')
            del i                               # Problem här
        else:
            print('the list is NOT empty')

    return matris



print(chomp([['**', '12'], ['21', '22'], ['31', '32'], ['41', '42'], ['51', '52'], ['61', '62']], 1, 0))

"""
OUTPUT: [['**', '12'], [], [], [], [], []]
VILL HA: [['**', '12']] 
"""
SeriousCephalopod 2696
Postad: 7 jan 2022 23:16 Redigerad: 7 jan 2022 23:25

Grundproblemet är att del är en operation som kräver ett index för att radera ett element ur en lista. När du skriver 

del i

där i är en rad i listan (dåligt val av namn) så ger du inget index så det räcker inte för att koden entydigt ska veta vad den ska radera. Python är magiskt så den kör koden ändå men gör något annat eftersom del är ett generiskt kommando. (Raderar referensen istället). Du behöver faktiskt ge lista+index för att del ska fungera: 'del lista[index]'. 

Här är min reducerade kod:

def truncate(M, from_row, from_col):
    del M[from_row:]                    #raderar alla rader från from_row och framåt
    for i, e in enumerate(M):
        del M[i][from_col:]             #raderar kolumner från from_col och framåt

M = [[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15], [16,17,18,19,20],[21,22,23,24,25]]

print('original:',M)
truncate(M, 3,2)
print('truncated',M)

En del kritik eftersom jag hade svårt att läsa koden. Det här var dåligt namngiven kod. Valet av variabelnamn för hela programmet är svårläst och gjorde att det tog ganska lång tid att förstå vad programmet skulle göra. 

  • då funktionen manipulerar och ändrar matrisen är det överflödigt att returnera matrisen i slutet. Detta är vad man skulle kallat en void-funktion i andra programmeringspråk. 
  • Att antal_rad inte betecknar ett antal rader (vaa?) är förvirrande.
  • Varför heter funktionen chomp?(eng?) Att chompa är att bita vilket borde beteckna att man tar bort ett hörn och lämnar resten. Att skära av bitar är möjligtvis att trunkera
  • "for i in matris:" är stilbrott. i bör inte användas för att beteckna något som inte är heltaltal. "for rad in matris" hade faktiskt kommunicerat vad det var
Svara
Close