Python — отсортированный список списков

#python #list #sorting

#python #Список #сортировка

Вопрос:

Всем привет, я, вероятно, упускаю что-то очевидное

Создаем список списков (в нотации C «vector\>»), затем пытаемся отсортировать внутренние списки («записи»), используя некоторые поля в качестве ключей сортировки. И это не сработало бы. Попробовал две разные версии: с «lambda» и с «itemgetter». Нет ошибки или предупреждения. Что я делаю не так?

//** мой код: начать

класс fwReport:

 def __init__(self):
    #each field from firewall log file, 17 all together
    self.fieldnames = ("date", "time", "action", "protocol", 
              "src-ip", "dst-ip", "src-port", "dst-port" 
              "size", "tcpflags", "tcpsyn", "tcpack", 
              "tcpwin", "icmptype", "icmpcode", "info", "path")
    self._fields = {}
    self.mx = list()
    self.dst_ip = collections.Counter()
    self.src_ip = collections.Counter()

def openfn(self):
    try:
        with open(fn) as f: data = f.read()
    except IOError as err:
        raise AssertionError("Can't open %s for reading: %s" % (fn, err))
        return
    #make a matrix out of data, smth. like list<list<field>>
    #skip first 5 lines (file header)
    for fields in data.split("n")[5:25]:
        temp = fields.split(" ")[:6] #take first 7 fields
        self.src_ip[temp[4]]  = 1 #count source IP
        self.dst_ip[temp[5]]  = 1 #count destination IP
        self.mx.append(temp) #build list of lists
    #sorted(self.mx, key=itemgetter(5)) #----> does not work
    sorted(self.mx, key=lambda fields: fields[5]) #--------> does not work
    for i in range(len(self.mx)):
        print(i, " ", self.mx[i][5])
    #print(self.dst_ip.most_common(16))
    #print(self.src_ip.most_common(16))
    print(self.mx[:5][:])
    #print(len(self.dst_ip))
  

*********

def main():

 mx = [["a", "b", "c"], ["a", "c", "b"], ["b", "a", "c"]]

mx = sorted(mx, key=lambda v: v[1])

for i in range(len(mx)):
    print(i, " ", mx[i], " ", mx[i], end="n")
  

0 [‘b’, ‘a’, ‘c’] [‘b’, ‘a’, ‘c’]

1 [‘a’, ‘b’, ‘c’] [‘a’, ‘b’, ‘c’]

2 [‘a’, ‘c’, ‘b’] [‘a’, ‘c’, ‘b’]

****

Работает нормально.

@Ned Batchelder — спасибо

Ответ №1:

sorted возвращает новый отсортированный список. Вы ничему не присваиваете значение. Попробуйте:

 self.mx = sorted(self.mx, key=itemgetter(5))
  

Комментарии:

1. Вы все еще можете сортировать на месте: self.mx.sort(key=...)

2. @9000 Спасибо, как на месте, так и в отсортированном виде (..), теперь работают. Вероятно, у меня был ментальный блок. До следующего раза…