269

I have a list of filenames in python and I would want to construct a set out of all the filenames.

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

This does not seem to work. How can do this?

Mr_and_Mrs_D
  • 32,208
  • 39
  • 178
  • 361
securecoding
  • 2,763
  • 2
  • 15
  • 14

8 Answers8

446

If you have a list of hashable objects (filenames would probably be strings, so they should count):

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

you can construct the set directly:

s = set(lst)

In fact, set will work this way with any iterable object! (Isn't duck typing great?)


If you want to do it iteratively:

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

But there's rarely a need to do it this way. I only mention it because the set.add method is quite useful.

mgilson
  • 300,191
  • 65
  • 633
  • 696
  • 1
    I am using 2.7 and this does not seem to work. What's going on here? Python 2.7.13 (default, Jul 24 2017, 14:22:59) [GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> x = [1,2,3] >>> set(x) set([1, 2, 3]) >>> – opus111 Dec 20 '17 at 18:49
  • @user1902291-- It looks like it worked, you just neek to keep track of the resulting set: `y = set(x)` – mgilson Dec 21 '17 at 20:38
  • Also note that adding items in the set from a list can prove to be very useful when you want to filter out duplicates from the list. – Pranjal Kumar Jul 03 '18 at 05:29
  • How about `s = {'foo.py', 'bar.py', 'baz.py', 'qux.py', Ellipsis}`? – Jari Turkia Sep 07 '21 at 12:20
  • Yes, that works -- though it isn't actually constructing a set out of a list of items as OP was requesting :). That's making a set literal. – mgilson Sep 07 '21 at 13:04
26

The most direct solution is this:

s = set(filelist)

The issue in your original code is that the values weren't being assigned to the set. Here's the fixed-up version of your code:

s = set()
for filename in filelist:
    s.add(filename)
print(s)
Tiago Martins Peres
  • 14,289
  • 18
  • 86
  • 145
Raymond Hettinger
  • 216,523
  • 63
  • 388
  • 485
21

You can do

my_set = set(my_list)

or, in Python 3,

my_set = {*my_list}

to create a set from a list. Conversely, you can also do

my_list = list(my_set)

or, in Python 3,

my_list = [*my_set]

to create a list from a set.

Just note that the order of the elements in a list is generally lost when converting the list to a set since a set is inherently unordered. (One exception in CPython, though, seems to be if the list consists only of non-negative integers, but I assume this is a consequence of the implementation of sets in CPython and that this behavior can vary between different Python implementations.)

HelloGoodbye
  • 3,624
  • 8
  • 42
  • 57
6

Here is another solution:

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

In this code I have used the set method in order to turn it into a set and then it removed all duplicate values from the list

Adi Ml
  • 125
  • 2
  • 12
2

You can also use list comprehension to create set.

s = {i for i in range(5)}
Si Thu
  • 1,212
  • 13
  • 12
1

Simply put the line:

new_list = set(your_list)
Adrita Sharma
  • 21,581
  • 10
  • 69
  • 79
muknerd
  • 13
  • 4
0

One general way to construct set in iterative way like this:

aset = {e for e in alist}
andrewchan2022
  • 4,953
  • 45
  • 48
0

All the above answers are correct but if you want to preserve the order of your list you'll need to proceed as follow

list(dict.fromkeys(your_list))
Shady Smaoui
  • 867
  • 9
  • 11