Set to string. Obvious:

>>> s = set([1,2,3])
>>> s
set([1, 2, 3])
>>> str(s)
'set([1, 2, 3])'

String to set? Maybe like this?

>>> set(map(int,str(s).split('set([')[-1].split('])')[0].split(',')))
set([1, 2, 3])

Extremely ugly. Is there better way to serialize/deserialize sets?

Use repr and eval:

>>> s = set([1,2,3])
>>> strs = repr(s)
>>> strs
'set([1, 2, 3])'
>>> eval(strs)
set([1, 2, 3])

Note that eval is not safe if the source of string is unknown, prefer ast.literal_eval for safer conversion:

>>> from ast import literal_eval
>>> s = set([10, 20, 30])
>>> lis = str(list(s))
>>> set(literal_eval(lis))
set([10, 20, 30])

help on repr:

repr(object) -> string
Return the canonical string representation of the object.
For most object types, eval(repr(object)) == object.

Try like this,

>>> s = set([1,2,3])
>>> s = list(s)
>>> s
[1, 2, 3]

>>> str=", ".join(str(e) for e in s)
>>> str="set(%s)" % str
>>> str
'set(1, 2, 3)'

The question is little unclear because the title of the question is asking about string and set conversion but then the question at the end asks how do I serialize ? !

let me refresh the concept of Serialization is the process of encoding an object, including the objects it refers to, as a stream of byte data.

If interested to serialize you can use:

json.dumps  -> serialize
json.loads  -> deserialize

If your question is more about how to convert set to string and string to set then use below code (it’s tested in Python 3)

String to Set


Set to String



def test():
    print("here is the set:",some_var_set,type(some_var_set))
    print("here is the string:",some_var_string,type(some_var_string))


If you do not need the serialized text to be human readable, you can use pickle.

import pickle

s = set([1,2,3])

serialized_s = pickle.dumps(s)
print "serialized:"
print serialized_s

deserialized_s = pickle.loads(serialized_s)
print "deserialized:"
print deserialized_s


set([1, 2, 3])

1) Set to String:

s = set({1,2,3,4}) # set with int values.

Convert each value of set as a string, and join them to return one string with , as a delimiter.
str_val=", ".join(list(map(str, s)))

output of str_val: '1, 2, 3, 4'

2) String to Set:

Split the string with , as a delimiter. It creates a list. Then convert the list as a set.

s = set(str_val.split(","))

output of s: {' 2', ' 3', ' 4', '1'}

if the len of the set 1

>>> s
{'[email protected]'}
>>> list(s)[0]
'[email protected]'

if the set has more than one value

>>> def set2str(l, spe=" - "):
       for i in l:
            s += f'{i}{spe}'
       return s[:len(s) - len(spe)]
>>> s.add('asfasf')
>>> set2str(s)
'asfasf - [email protected]'
>>> set2str(s,' ') # you can change the spe
'asfasf [email protected]'