Как построить набор элементов списка в Python?


170

У меня есть listимя файла в Python, и я хотел бы создать setиз всех имен файлов.

filelist=[]
for filename in filelist:
    set(filename)

Это не похоже на работу. Как это сделать?

Ответы:


322

Если у вас есть список хешируемых объектов (имена файлов, вероятно, будут строками, поэтому их следует учитывать):

lst = ['foo.py', 'bar.py', 'baz.py', 'qux.py', Ellipsis]

Вы можете построить набор напрямую:

s = set(lst)

Фактически, так setбудет работать с любым повторяемым объектом! (Разве утка не печатает здорово?)


Если вы хотите сделать это итеративно:

s = set()
for item in iterable:
    s.add(item)

Но редко нужно делать это таким образом. Я упоминаю об этом только потому, что этот set.addметод весьма полезен.


1
Я использую 2.7, и это не похоже на работу. Что тут происходит? Python 2.7.13 (по умолчанию, 24 июля 2017 г., 14:22:59) [GCC 4.2.1 Совместимый Apple LLVM 8.1.0 (clang-802.0.42)] на darwin Тип «помощь», «авторское право», «кредиты» или «лицензия» для получения дополнительной информации. >>> x = [1,2,3] >>> set (x) set ([1, 2, 3]) >>>
opus111

@ user1902291-- Похоже, что это сработало, просто нужно следить за полученным набором: y = set(x)
mgilson

Также обратите внимание, что добавление элементов в набор из списка может оказаться очень полезным, если вы хотите отфильтровать дубликаты из списка.
Пранджал Кумар

12

Наиболее прямым решением является следующее:

 s = set(filelist)

Проблема в исходном коде заключается в том, что значения не были назначены набору . Вот исправленная версия вашего кода:

 s = set()
 for filename in filelist:
     s.add(filename)
 print(s)

9

Ты можешь сделать

my_set = set(my_list)

или, для Python 3,

my_set = {*my_list}

создать набор из списка. И наоборот, вы также можете сделать

my_list = list(my_set)

или, для Python 3,

my_list = [*my_set]

создать список из набора.

Просто отметьте, что порядок элементов в списке обычно теряется при преобразовании списка в набор, поскольку набор по своей природе неупорядочен. (Тем не менее, одно исключение в CPython, по-видимому, состоит в том, что список состоит только из неотрицательных целых чисел, но я предполагаю, что это является следствием реализации множеств в CPython и что это поведение может различаться в разных реализациях Python.)


4

Вот еще одно решение:

>>>list1=["C:\\","D:\\","E:\\","C:\\"]
>>>set1=set(list1)
>>>set1
set(['E:\\', 'D:\\', 'C:\\'])

В этом коде я использовал метод set, чтобы превратить его в набор, а затем он удалил все повторяющиеся значения из списка


1

Один общий способ построить множество итеративным способом, как это:

aset = {e for e in alist}

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.