Надысь понадобилось профильтровать список на наличие повторяющихся элементов. Сразу оговорюсь, речь идет о Python 1.4.5. Ну, я, как любитель велосипедов, сделал так:
> L = [1, 2, 3, 1, 2, 4, 5, 6, 4]
> [y for x, y in zip(xrange(len(L)), L) if y not in L[:x]]
[1, 2, 3, 4, 5, 6]
>
#
но потом вспомнил о Сетах. Сеты - неотсортированная коллекция уникальных элементов. Воспользоваться ими дает нам встроенный модуль sets. Итак,
> from sets import Set as set
> list(set(L))
[1, 2, 3, 4, 5, 6]
>
работает намного быстрее.
#
Ну, и напоследок, еще пример. Пусть есть два списка работников:
sellers = ['Petrov', 'Ivanov', 'Zadov', 'Vartanov', 'Matveyev'] # работают в отделе продавцов
#
drivers = ['Ivanov', 'Rabinovich', 'Pupkin', 'Zadov', 'Nalivayko', 'Losev'] # работают в отделе водителей
#
Как видим, некоторые личности умудряются совмещать должности, дабы побольше заработать).
Сгенерируем сеты:
s1 = set(sellers)
s2 = set(drivers)
#
список всех работников:
print 'total: %s' %list(s1 | s2)
#
список работников, совмещающих должности:
print 'seller + driver: %s' %list(s1 & s2)
#
только продавцы, только водители в своих разделах:
print 'seller onl
y: %s, driver only: %s' %(list(s1 - s2), list(s2 - s1))
#
список работников, не совмещающих должности:
print 'seller or driver only: %s' %list(s1 ^ s2)
#
Ну, а узнать больше можно из документации.
Здесь находятся
всего 0. За сутки здесь было 0 человек


Не ошибаешься, и set, и enumerate есть.
0 ответить