Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Python: сортировка по двум полям  (Прочитано 6263 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Jack Sparrow

  • Автор темы
  • Активист
  • *
  • Сообщений: 641
    • Просмотр профиля
Python: сортировка по двум полям
« : 24 Марта 2012, 22:06:46 »
Есть список кортежей, например:
t = [('c','3'),('e','11'),('b','10'),('a','1')]
Каждый кортеж состоит из элементов string. Нужно сделать так, чтобы цифры были не типа string, а integer. Т.к. элементы кортежа нельзя изменить, то просто каждый кортеж меняю на другой:
for elem in t:
    elem = (elem[0],) + (int(elem[1]),)
Затем делаю проверку:
for elem in t:
    print elem, type(elem[0]), type(elem[1])
Ее вывод показывает, что string не меняется на integer. Вот полный текст программы:
t = [('c','3'),('e','11'),('b','10'),('a','1')]
for elem in t:
    elem = (elem[0],) + (int(elem[1]),)

for elem in t:
    print elem, type(elem[0]), type(elem[1])
А вот ее вывод:
('c', '3') <type 'str'> <type 'str'>
('e', '11') <type 'str'> <type 'str'>
('b', '10') <type 'str'> <type 'str'>
('a', '1') <type 'str'> <type 'str'>
Интересно то, что если все это делать в интерактивном режиме для одной строчки (без цикла), то все работает так, как и ожидалось (видно, что единица получается без кавычек):
>>> elem = ('a', '1')
>>> elem = (elem[0],) + (int(elem[1]),)
>>> elem
('a', 1)
>>>
Что это означает или где я ошибаюсь?

PS. Вообще-то все это нужно для того, чтобы отсортировать список методом sorted() так, чтобы числа сортировались в порядке возрастания, т.е. чтобы после 1 было 2, а не 10, 11... 19, 2, 3...
« Последнее редактирование: 25 Марта 2012, 11:50:21 от Jack Sparrow »
Нейросети тебя не заменят. Тебя заменит человек, который умеет ими пользоваться.

Оффлайн ende_neu

  • Старожил
  • *
  • Сообщений: 2473
    • Просмотр профиля
Ошибаетесь вы в том, что считаете будто в интерактивном режиме меняется.
На второй строчке вы заменяете первый кортеж другим. И зачем эти плюсы/запятые - (elem[0], int(elem[1])) же.
А в списке вы ничего не меняете, читайте про append, pop, remove и т.п. для изменения элементов листа http://docs.python.org/tutorial/datastructures.html
Т.е. так например
Код: (python) [Выделить]
t = [('c', '3'),('e','11'),('b','10'),('a','1')]

for v in range(len(t)):
a, z = t.pop(0)
t.append((a, int(z)))

andrey_p

  • Гость
Для решения задачи лучше:
sorted(t, key=lambda x: int(x[1]))или
t.sort(key=lambda x: int(x[1]))
Не получилось в цикле, потому-что elem в цикле не синоним элемента в списке (как в Перл, к примеру), а самостоятельная переменная - ей присваивается значение, а потом оно переприсваевается следующим элементом цикла и старое (измененное) пропадает.
« Последнее редактирование: 25 Марта 2012, 08:43:01 от andrey_p »

Оффлайн Jack Sparrow

  • Автор темы
  • Активист
  • *
  • Сообщений: 641
    • Просмотр профиля
ende_neu, ну конечно! Просто забыл, что изменение элементов списка производится по индексу.
andrey_p, первый код
sorted(t, key=lambda x: int(x[1]))
почему-то не работает. Зато второй оказался тем, что и нужно.

По идее, мне нужно сортировать по двум полям: сначала по первому, затем по второму. Немного погуглил и поправил код следующим образом:
t.sort(key=lambda x: (x[0], int(x[1])))

PS. Спасибо, что ткнули носом.
Нейросети тебя не заменят. Тебя заменит человек, который умеет ими пользоваться.

 

Страница сгенерирована за 0.029 секунд. Запросов: 26.