2013-10-24 1 views
0

Рассмотрим следующий пример:Какова наилучшая практика добавления кортежей в набор?

In [44]: exl_set = set(a.node) 
In [45]: exl_set 
Out[45]: set(['1456030', '-9221969']) 
In [46]: exl_set.add(b.node) 
In [47]: exl_set 
Out[47]: set(['1456030', ('-9227619', '1458170'), '-9221969']) 

Каков наилучший способ добавить tuples длины 2 к set, не нарушая их друг от друга с первого add? Результат должен выглядеть следующим образом:

Out[48]: set([ ('-9221969','1456030'),('-9227619', '1458170')]) 

ответ

3

Оберните начальный узел в списке или кортеже:

exl_set = set([a.node]) 

не иметь это интерпретируется как последовательность значений.

Конструктор set() интерпретирует аргумент как итерируемый и принимает все значения в этом итерабельном для добавления в набор; от the documentation:

классset([iterable]):
Возврат новый набор или frozenset объект, элементы которого взяты из iterable.

Демо:

>>> node = ('1456030', '-9221969') 
>>> set(node) 
set(['1456030', '-9221969']) 
>>> set([node]) 
set([('1456030', '-9221969')]) 
>>> len(set([node])) 
1 

С другой стороны, создать пустой набор и использовать set.add() исключительно:

exl_set = set() 
exl_set.add(a.node) 
exl_set.add(b.node) 
+0

Я отредактировал мой вопрос. Кажется, я был недостаточно ясен. – LarsVegas

+0

Yup, обновленный ответ. –

+0

Спасибо! Ну, конечно, я подумал об этом. Но это означает, что я должен следить за своей итерацией. Думал, что может быть лучший способ пойти ... – LarsVegas

1

При инициализации набора, аргумент трактуется как iterable, а не как единый товар. Вы можете сделать это так:

>>>node = (1, 3) 
    >>>node_set = set([node,]) # initialize a set with a single ilement 
    >>>node_set 
    set([(1, 3)]) 

или в качестве альтернативы:

>>>node = (1, 4) 
    >>>node_set = set() # initialize an empty set 
    >>>node_set.add(node) # add a single element 
    >>>node_set 
    set([(1, 4)]) 

 Смежные вопросы

  • Нет связанных вопросов^_^