Python: как объединить записи в наборе в одну строку?

85

По сути, я пытаюсь объединить записи в набор, чтобы вывести одну строку. Я пытаюсь использовать синтаксис, аналогичный функции объединения для списков. Вот моя попытка:

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(", ")

Однако я получаю эту ошибку: AttributeError: 'set' object has no attribute 'join'

Что эквивалентно призыву для наборов?

Спенсер
источник

Ответы:

166
', '.join(set_3)

Это joinстроковый метод, а не метод набора.

Jmjmh
источник
14
если ваш набор содержит целые / длинные числа, вы должны использовать', '.join(str(s) for s in set_3)
55651909-089b-4e04-9408-47c5bf
32

У наборов нет joinметода, но вы можете его использовать str.join.

', '.join(set_3)

str.joinМетод будет работать на любой Iterable объекта , включая списки и множество.

Примечание: будьте осторожны при использовании этого на наборах, содержащих целые числа; вам нужно будет преобразовать целые числа в строки перед вызовом присоединения. Например

set_4 = {1, 2}
', '.join(str(s) for s in set_4)
Джек Эдмондс
источник
5

joinВызывается на строке:

print ", ".join(set_3)
МБыД
источник
4

Такого метода нет setни у, ни у строки:listjoin

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

Кстати, вы не должны использовать имя listдля своих переменных. Дайте ему list_, my_listили другое название , потому что listочень часто используется функция питона.

Лыжи
источник
4

У наборов нет заказа, поэтому вы можете потерять свой заказ, когда конвертируете свой список в набор, то есть:

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

Обычно порядок остается, но для больших наборов его почти наверняка не будет.

Наконец, на всякий случай, если люди задаются вопросом, вам не нужна ',' в соединении.

Просто: '' .join (набор)

:)

Джон
источник
3

Я думаю, у вас это просто наоборот.

print ", ".join(set_3)
рекурсивный
источник
Неверный синтаксис нет? print(", ".join(set_3))
стивен
1
Действует в 2.7.
рекурсивный
3

У вас есть оператор соединения в обратном порядке:

print ', '.join(set_3)
Охотник
источник
0

Я написал метод, который обрабатывает следующие крайние случаи:

  • Установите размер один. А ", ".join({'abc'})вернется "a, b, c". Мой желаемый результат был "abc".
  • Установить, включая целые числа.
  • Пустой набор должен вернуться ""
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))
Фернандо Ираррасаваль G
источник
Мог бы использовать " ".join({'abc'})для получения желаемого о / п "abc". исполняемый код в repl.it
Abhijeet
Интересно. Только что понял, что set ('abc') и {'abc'} ведут себя по-разному. Вот что меня сбило с толку.
Фернандо Ираррасаваль G
Я обновил исполняемый код для работы с набором и словарем
Abhijeet
К вашему сведению, {'abc'} - это набор. И "".join(set(ip_data))дает случайный порядок букв (например, 'bca'), потому что set создает три элемента {'a', 'b', 'c'}, но не сохраняет порядок.
Фернандо Ираррасаваль G