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?

Respuestas:



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)

5

Se joinllama en la cadena:

print ", ".join(set_3)

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.


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)

:)



3

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

print ', '.join(set_3)

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))

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.