Anexar valores a um conjunto em Python

372

Eu tenho um conjunto como este:

keep = set(generic_drugs_mapping[drug] for drug in drug_input)

Como adiciono valores [0,1,2,3,4,5,6,7,8,9,10]a este conjunto?

eu--''''''---------''''''''''''
fonte

Respostas:

405
keep.update(yoursequenceofvalues)

por exemplo, keep.update(xrange(11))para o seu exemplo específico. Ou, se você precisar produzir os valores em um loop por algum outro motivo,

for ...whatever...:
  onemorevalue = ...whatever...
  keep.add(onemorevalue)

Mas, é claro, fazer isso em massa com uma única .updatechamada é mais rápido e prático, quando possível.

Alex Martelli
fonte
78
.addadiciona um único item, .updateadiciona vários itens. Isso está correto?
ThorSummoner
16
@ThorSummoner Sim, .addespera que um único tipo Hashable, enquanto .updateespera um objeto iterável
Bonnie
4
Se você adicionar uma string com atualização, ela adicionará um item por caractere na string, porque é iterável!
Hgolov
2
É de fato importante notar que as cadeias de caracteres, como objetos "inteiros", devem ser adicionadas .add, e não .updaterecentemente, eu enfrentei um bug bastante sorrateiro por causa desses pequenos detalhes.
Lalilulelost
278

Definir conjunto

a = set()

Use add para acrescentar valores únicos

a.add(1)
a.add(2)

Use update para adicionar elementos de tuplas, conjuntos, listas ou conjuntos congelados

a.update([3,4])

>> print(a)
{1, 2, 3, 4}

Se você deseja adicionar uma tupla ou um conjunto congelado, use add

a.add((5, 6))

>> print(a)
{1, 2, 3, 4, (5, 6)}

Nota: Como os elementos do conjunto devem ser laváveis ​​e as listas são consideradas mutáveis, você não pode adicionar uma lista a um conjunto. Você também não pode adicionar outros conjuntos a um conjunto. No entanto, você pode adicionar os elementos de listas e conjuntos, conforme demonstrado com o método ".update".

RandallShanePhD
fonte
105

Você também pode usar o |operador para concatenar dois conjuntos ( união na teoria dos conjuntos):

>>> my_set = {1}
>>> my_set = my_set | {2}
>>> my_set
{1, 2}

Ou um formulário mais curto usando |=:

>>> my_set = {1}
>>> my_set |= {2}
>>> my_set
{1, 2}

Nota: Nas versões anteriores ao Python 2.7, use em set([...])vez de {...}.

nyuszika7h
fonte
11
Se você tem uma lista de conjuntos my_sets, então você pode fazer big_set = my_sets[0].union(*my_sets[1:])para combiná-los todos
zelusp
45

Use updateassim:

keep.update(newvalues)
sberry
fonte
10

Esta pergunta é a primeira que aparece no Google quando se consulta "Python como adicionar elementos ao conjunto". Portanto, vale a pena observar explicitamente que, se você deseja adicionar uma string inteira a um conjunto, ela deve ser adicionada com .add(), não .update().

Digamos que você tenha uma string foo_strcujo conteúdo seja 'this is a sentence'e tenha algum conjunto bar_setigual a set().

Se o fizer bar_set.update(foo_str), o conteúdo do seu conjunto será {'t', 'a', ' ', 'e', 's', 'n', 'h', 'c', 'i'}.

Se o fizer bar_set.add(foo_str), o conteúdo do seu conjunto será {'this is a sentence'}.

lalilulelost
fonte
3

A maneira que eu gosto de fazer isso é converter o conjunto original e os valores que gostaria de adicionar em listas, adicioná-los e depois convertê-los novamente em um conjunto, como este:

setMenu = {"Eggs", "Bacon"}
print(setMenu)
> {'Bacon', 'Eggs'}
setMenu = set(list(setMenu) + list({"Spam"}))
print(setMenu)
> {'Bacon', 'Spam', 'Eggs'}
setAdditions = {"Lobster", "Sausage"}
setMenu = set(list(setMenu) + list(setAdditions))
print(setMenu)
> {'Lobster', 'Spam', 'Eggs', 'Sausage', 'Bacon'}

Dessa forma, também posso adicionar facilmente vários conjuntos usando a mesma lógica, o que me leva a um erro TypeError: unhashable type: 'set'se tentar fazê-lo com o .update()método

Kira Resari
fonte
2
keep.update((0,1,2,3,4,5,6,7,8,9,10))

Ou

keep.update(np.arange(11))
rishi jain
fonte
0

Para mim, no Python 3, está funcionando simplesmente desta maneira:

keep = keep.union((0,1,2,3,4,5,6,7,8,9,10))

Não sei se pode estar correto ...

decadenza
fonte