Распаковка вложенных списков отсортированного списка

Имеется вот такой код. Программа считывает IP-адреса и выводит их в порядке возрастания в соответствии с десятичным представлением. В принципе она выводит, но только как лист в квадратных скобках и элементы как тип str. А нужно вывести без скобок и без кавычек. Пробовал создать новый пустой список, кортеж ad = (*sorted(spisok, key=lambda spisok: des(spisok)) и потом его циклом по очереди выводить, ошибка. Подскажите пожалуйста как распаковать вложенные списки без скобок и без кавычек?


    n = int(input())
    spisok = [input().split('.') for i in range(n)]


    def des(spisok):
        obratnyi_spisok = []
        for u in range(len(spisok)):
            obratnyi_spisok.append(spisok[u][::-1])
        summa_desyat = []
        for i in range(len(spisok)):
            for j in range(len(spisok[i])):
                total = 0
                for k in range(len(obratnyi_spisok[i])):
                    total += int(obratnyi_spisok[i][k]) * 256 ** k
            summa_desyat.append(total)
        return summa_desyat
    
    
    print(*sorted(spisok, key=lambda spisok: des(spisok)), sep='\n')


Ответы (2 шт):

Автор решения: Stanislav Volodarskiy

Не нужно портить данные при вводе ради сортировки. Плохо что вы разбираете строки на составные части при вводе, а потом пытаетсь восстановить их обратно при печати. Всю логику по сравнению строк перенесите в key=.... Сами строки проходят через программу без изменений.

Питон умеет сортировать кортежи, считать сумму нет необходимости:

def key(ip):
    return tuple(map(int, ip.split('.')))


n = int(input())
ips = [input() for _ in range(n)]
print(*sorted(ips, key=key), sep='\n')

Или без именованных функций и промежуточных списков:

print(
    *sorted(
        (input() for _ in range(int(input()))),
        key=lambda ip: tuple(map(int, ip.split('.')))
    ),
    sep='\n'
)
→ Ссылка
Автор решения: Alexey Trukhanov

Разрешите, я предложу свое решение, если я правильно понял задачу.

Дан список IP-адресов, представленный списком строк. В Вашем коде он вводится из стандартного ввода, я его сгенерирую рандомно, чтобы не возиться с вводом каждый раз во время тестирования.

import random

ip_list = ['.'.join([str(random.randint(0, 255)) for _ in range(4)]) for _ in range(10)]
print(ip_list)

Ваше решение, с вводом, можно потом вернуть, только не разбивая его на отдельные числа.

ip_list = [input() for _ in range(int(input())]

Далее, надо добавить к каждому числу в адресе лидирующие нули, так чтобы длина каждого IP стала одинаковой - каждое число будет занимать три знака с лидирующими нулями, после чего эти строки можно будет сортировать в лексикографическом порядке.

ip_list_new = sorted(['.'.join([f'{int(x):03}' for x in ip.split('.')]) for ip in ip_list])

Далее обратно убираем лидирующие нули:

ip_list_new = ['.'.join([str(int(x)) for x in ip.split('.')]) for ip in ip_list_new]

Печатаем.

print(*ip_list_new, sep = "\n")
→ Ссылка