Tips and tricks (Советы и приемы)

Главная Форумы Python Синтаксис и родные библиотеки Python Tips and tricks (Советы и приемы)

В этой теме 64 ответа, 8 участников, последнее обновление  Khasan Mamaev 2 нед., 6 дн. назад.

Просмотр 5 сообщений - с 61 по 65 (из 65 всего)
  • Автор
    Сообщения
  • #6859 Score: 5

    txt
    Модератор
    65 pts

    как известно, при использовании set(list) мы преобразуем исходный список во множество , то есть элементы становятся неупорядоченными (в сравнении с исходным списком) и уникальными.
    Один из способов сохранить порядок исходного списка с уникальными элементами:
    (для сравнения используем также set):
    inn = [9,8,8,7,5,5,7]
    set=set(inn)
    set_save_order=[ els for indx,els in enumerate(inn) if inn.index(els)==indx ]
    OUT = set, set_save_order

    #6868 Score: 2

    txt
    Модератор
    65 pts

    Ввиду того , что мне подсказали как это сделать, делюсь
    в дополнение к посту #5622 (Получение индексов повторяющихся элементов в отдельных списках ):

    Имеется исходный список:
    lst=[4,2,1,1,2,3]
    Задача: получить на выходе 2 списка:
    1.) Лист (lst_els) с подсписками уникальных элементов (сохранив первоначальный порядок следования элементов);
    2.) Лист (lst_indx) со списком индексов элементов lst_els относительно исходного листа lst.
    Решение:
    lst = [4, 2, 1, 1, 2, 3]
    counted = set()
    lst_els = [[a]*lst.count(a) for a in (x for x in lst if not (x in counted or counted.add(x)))]
    lst_indx = [[i for i, y in enumerate(lst) if y == x[0]] for x in lst_els]
    OUT=lst_els, lst_indx

    На выходе получаем:
    lst_els=[[4],[2,2],[1,1],[3]]
    lst_indx=[[0],[1,4],[2,3],[5]]

    #6869 Score: 1

    Legantmar
    Хранитель
    358 pts

    найти неповторяющиеся элементы в списке, через подсчет их количества

    s = ["a", "b", "d", "e", "b", "d"] # входной список
    OUT = [i for i in set(s) if s.count(i) == 1]

    >>[‘e’, ‘a’]  – на выходе получим нужные элементы (небольшая “засада” в том, что их порядок немного отличается от первоначального)

    Обращаю ваше внимание, что команда s.count(i) – подсчитывает количество вхождений элемента i в списке (листе) s
    т.е. s.count(“b”) выдаст значение 2 (буква b  встречается 2 раза во входном листе)

    #6871 Score: 1

    txt
    Модератор
    65 pts

    + если все-таки важно сохранить порядок то, используя #6859 :

    s = ["a", "b", "d", "e", "b", "d"] # входной список
    def set_save(x):
       return [els for indx,els in enumerate(x) if x.index(els)==indx]
    OUT = [i for i in set_save(s) if s.count(i) == 1]

    >>[‘a’,‘e’]

    p.s. или в одну строку OUT = [i for i in [els for indx,els in enumerate(s) if s.index(els)==indx] if s.count(i) == 1]

    #6873 Score: 1

    Khasan Mamaev
    Хранитель
    171 pts

    Есть еще такой вариант
    import sys
    sys.path.append(r’C:\Program Files (x86)\IronPython 2.7\Lib’)

    from collections import Counter
    A = [10, 10, 23, 10, 123, 66, 78, 123]
    print filter(lambda x: x[1] == 1, Counter(A).items())
Просмотр 5 сообщений - с 61 по 65 (из 65 всего)

Для ответа в этой теме необходимо авторизоваться.