Распаковка вложенных списков отсортированного списка
Имеется вот такой код. Программа считывает 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 шт):
Не нужно портить данные при вводе ради сортировки. Плохо что вы разбираете строки на составные части при вводе, а потом пытаетсь восстановить их обратно при печати. Всю логику по сравнению строк перенесите в 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'
)
Разрешите, я предложу свое решение, если я правильно понял задачу.
Дан список 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")