2010-04-28 7 views
1

я использую Python, и у меня есть список наборов, построенных, как это:Добавить значение элемента в списке наборов

list = [set([])]*n 

... где п число наборов I хочу в списке. Я хочу добавить значение к определенному набору в списке. Скажем, второй сет. Я попытался

list[1].add(value) 

Но вместо этого добавляет значение каждый набор в списке. Это поведение довольно неинтуитивно для меня. В результате дальнейших тестов, я думаю, я нашел проблему: список, по-видимому, содержит 10 экземпляров одного и того же набора или десять указателей на один и тот же набор или что-то еще. Создание списка с помощью повторных вызовов

list.append(set([])) 

позволило мне использовать синтаксис выше для добавления элементов в отдельные наборы. Поэтому мой вопрос таков: что именно происходит в моем первом методе построения списка? Понятно, что я не понимаю синтаксис так хорошо. Кроме того, есть ли лучший способ инициализировать список n-элементов? Я использовал этот синтаксис некоторое время, и это моя первая проблема.

+1

Как примечание стороны, 'набор()' кажется более очевидным образом, чтобы написать 'установить ([]) '. –

+0

Ах, спасибо за подсказку. Я всегда видел это с квадратными скобками внутри, я думал, что они являются обязательными. Чем больше ты знаешь! – Kapelson

ответ

5

Вы в значительной степени суммировали проблему самостоятельно - синтаксис X*n делает один экземпляр X и включает его n раз. Это не проблема для таких вещей, как 'a'*10, потому что неважно, будет ли каждый символ в этой строке указывать на один и тот же «а», но он делает для изменяемых конструкций, таких как списки и наборы. Вы можете сделать n отдельных наборов с использованием перечня:

list = [set() for x in xrange(n)] 
+0

А, это своего рода короткое, сладкое, компактное заявление, которое мне нравится. Огромное спасибо. – Kapelson

+0

Компактность, подобная этой, является основной причиной, по которой мне нравится Python :) –

+2

Компактность? Sheesh. 'list = [set() для x в xrange (n)]' –

1

Да, это правильно. Синтаксис * просто копирует ссылку много раз. Ваш метод работает отлично, или вы можете использовать список понимание, чтобы построить что много наборов, как в:

 
list = [set([]) for x in xrange(n)]; 
Смежные вопросы