Reputation: 3451
If I have a string, and want to create a set that initially contains only that string, is there a more Pythonic approach than the following?
mySet = set()
mySet.add(myString)
The following gives me a set of the letters in myString
:
mySet = set(myString)
Upvotes: 75
Views: 66848
Reputation: 1073
use mySet = {mystring}
Python 3.6.9 (default, Sep 24 2019, 14:35:19)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.8.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: def s(i):
...: r = set()
...: r.add(i)
...: return r
...:
In [2]: %timeit s(1234)
218 ns ± 5.99 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [3]: %timeit set([1234])
201 ns ± 3 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
In [4]: %timeit {1234}
51.7 ns ± 1.7 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
Upvotes: 1
Reputation: 4184
set(obj)
is going to iterate trough obj
and add all unique elements to the set. Since strings are also iterable, if you pass a string to set()
then you get the unique letters in your set. You can put your obj to a list first:
set(["mystring"])
However that is not elegant IMO. You know, even for the creation of an empty dictionary we prefer {}
over dict()
. Same here. I wolud use the following syntax:
myset = {"mystring"}
Note that for tuples, you need a comma after it:
mytuple = ("mystring",)
Upvotes: 3
Reputation: 251001
set_display ::= "{" (expression_list | comprehension) "}"
Example:
>>> myString = 'foobar'
>>> s = {myString}
>>> s
set(['foobar'])
>>> s = {'spam'}
>>> s
set(['spam'])
Note that an empty {}
is not a set
, its a dict
.
Help on set
:
class set(object)
| set() -> new empty set object
| set(iterable) -> new set object
As you can see set()
expects an iterable and strings are iterable too, so it converts the string characters to a set.
Put the string in some iterable and pass it to set()
:
>>> set(('foo',)) #tuple
set(['foo'])
>>> set(['foo']) #list
set(['foo'])
Upvotes: 7
Reputation: 122376
If the set also isn't likely to change, consider using a frozenset
:
mySet = frozenset([myString])
Upvotes: 0