Python: ¿cómo unir entradas de un conjunto en una sola cadena?

84

Básicamente, estoy tratando de unir las entradas en un conjunto para generar una cadena. Estoy tratando de usar una sintaxis similar a la función de unión para listas. Aquí está mi intento:

list = ["gathi-109","itcg-0932","mx1-35316"]
set_1 = set(list)
set_2 = set(["mx1-35316"])
set_3 = set_1 - set_2
print set_3.join(", ")

Sin embargo, obtengo este error: AttributeError: 'set' object has no attribute 'join'

¿Cuál es la convocatoria equivalente para conjuntos?

Spencer
fuente

Respuestas:

165
', '.join(set_3)

El joines un método de cadena, no es un método establecido.

Jmjmh
fuente
14
si su conjunto contiene enteros / largos, debe usar', '.join(str(s) for s in set_3)
55651909-089b-4e04-9408-47c5bf
31

Los conjuntos no tienen un joinmétodo, pero puedes usarlo str.joinen su lugar.

', '.join(set_3)

El str.joinmétodo funcionará en cualquier objeto iterable, incluidas listas y conjuntos.

Nota: tenga cuidado al usar esto en conjuntos que contengan números enteros; deberá convertir los enteros en cadenas antes de la llamada para unirse. Por ejemplo

set_4 = {1, 2}
', '.join(str(s) for s in set_4)
Jack Edmonds
fuente
5

Se joinllama en la cadena:

print ", ".join(set_3)
MByD
fuente
4

Ni el setni el listtiene tal método join, la cadena lo tiene:

','.join(set(['a','b','c']))

Por cierto, no debes usar un nombre listpara tus variables. Asígnele un nombre list_, my_listo algún otro nombre, porque listse usa con mucha frecuencia la función de Python.

Esquí
fuente
4

Los conjuntos no tienen un pedido, por lo que puede perder su pedido cuando convierta su lista en un conjunto, es decir:

>>> orderedVars = ['0', '1', '2', '3']
>>> setVars = set(orderedVars)
>>> print setVars
('4', '2', '3', '1')

Por lo general, el orden se mantendrá, pero es casi seguro que no lo hará en conjuntos grandes.

Finalmente, en caso de que la gente se pregunte, no necesita un ',' en la combinación.

Solo: '' .join (conjunto)

:)

Juan
fuente
3

Creo que lo tienes al revés.

print ", ".join(set_3)
recursivo
fuente
¿Sintaxis no válida no? print(", ".join(set_3))
Stephen
1
Es válido en 2.7.
recursivo
3

Tienes la declaración de unión al revés, prueba:

print ', '.join(set_3)
Cazador
fuente
0

Escribí un método que maneja los siguientes casos extremos:

  • Establecer talla uno. A ", ".join({'abc'})volverá "a, b, c". Mi salida deseada fue "abc".
  • Establecer incluyendo enteros.
  • El conjunto vacío debería volver ""
def set_to_str(set_to_convert, separator=", "):
        set_size = len(set_to_convert)
        if not set_size:
            return ""
        elif set_size == 1:
            (element,) = set_to_convert
            return str(element)
        else:
            return separator.join(map(str, set_to_convert))
Fernando Irarrázaval G
fuente
Podría haber utilizado " ".join({'abc'})para obtener el o / p deseado "abc". código ejecutable en repl.it
Abhijeet
Interesante. Me acabo de dar cuenta de que set ('abc') y {'abc'} tienen comportamientos diferentes. Eso es lo que me desconcertó.
Fernando Irarrázaval G
He actualizado el código ejecutable para que funcione con el conjunto y el diccionario
Abhijeet
FYI, {'abc'} es un conjunto. Y "".join(set(ip_data))da un orden aleatorio de las letras (ejemplo, 'bca') porque el conjunto crea tres elementos {'a', 'b', 'c'} pero no conserva el orden.
Fernando Irarrázaval G