Форум сайта python.su
Добрый день.
Есть список списков. Вложенный список всегда из двух элементов, вложенные списки могут повторяться, например:
lst = [[1, 12], [1, 12], [3, 32], [2, 22], [3, 32], [2, 22]]
lst.sort(key=lambda x: x[0])
from itertools import groupby new_lst = [el for el, _ in groupby(lst)]
Офлайн
SomethingButNotNickName1. никакой магии - нижнее подчеркивание это валидное имя переменной
Запятая и нижнее подчеркивание - что за магия?
Офлайн
это списковое выражение ( list comprehention)
символ _ никакая ни магия, а такое же имя переменной как a или value, но с тем отличием что оно общепринятое, его используют тогда, когда надо присвоить переменной значение, но сама переменная не нужна. Пример
l = [0, 1] a, b = l # 1 a, _ = l # 2
>>> l = list(range(10)) >>> l [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> a, _, c = l Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: too many values to unpack (expected 3) >>> a, *_, c = l >>> a, _, c (0, [1, 2, 3, 4, 5, 6, 7, 8], 9)
new_lst = [el for (el, _) in groupby(lst)]
[a for b in c]
Офлайн
SomethingButNotNickNameтут надо поменять местами пункты
Задача:
1) удалить повторяющиеся элементы;
2) отсортировать по первому элементу вложенного списка.
Офлайн
Итак по порядку. Поправьте где не прав.
1) квадратные скобки вокруг всей конструкции справа - генератор списка. Т.е. каждый элемент el который он вернет, будет записан в список new_lst
2) groupby(lst) - создает некий итератор, содержащий элементы исходного lst, но разбитые по группам в соответствии с переданной в groupby() функцией. Т.е. res = groupby(lst) это список кортежей вида (элемент исходного списка, itertools._grouper object). Причем, если подряд идут два одинаковых вложенных списка, дубликаты не включаются.
3) запускается цикл в котором из groupby() вынимается каждый кортеж в виде (el, _).
4) берется значение el и пишется в new_list. Значение _ теряется.
Суть верно изложил?
и если да, то остаются вопросы:
1) что такое itertools._grouper object и его назначение.
2) Как было верно подмечено данный алгоритм не удаляет дубликаты идущие не подряд. groupby можно использовать только с предварительно отсортированными массивами ( и для не сортированных нужен другой метод) или можно отредактировать мой код?
Офлайн
SomethingButNotNickName
1) что такое itertools._grouper object и его назначение.
>>> import itertools >>> >>> it = itertools.groupby('abbccc') >>> >>> elem = next(it) >>> elem ('a', <itertools._grouper object at 0x7f53b0bad780>) >>> list(elem[1]) ['a'] >>> >>> elem = next(it) >>> elem ('b', <itertools._grouper object at 0x7f53b0bad7f0>) >>> list(elem[1]) ['b', 'b'] >>> >>> elem = next(it) >>> elem ('c', <itertools._grouper object at 0x7f53b0bad7b8>) >>> list(elem[1]) ['c', 'c', 'c'] >>>
Офлайн