Як побудувати набір елементів із списку в 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.