【发布时间】:2011-03-24 11:16:53
【问题描述】:
我有一套这样的:
keep = set(generic_drugs_mapping[drug] for drug in drug_input)
如何将值 [0,1,2,3,4,5,6,7,8,9,10] 添加到此集合中?
【问题讨论】:
我有一套这样的:
keep = set(generic_drugs_mapping[drug] for drug in drug_input)
如何将值 [0,1,2,3,4,5,6,7,8,9,10] 添加到此集合中?
【问题讨论】:
定义集合
a = set()
使用 add 附加单个值
a.add(1)
a.add(2)
使用更新从元组、集合、列表或冻结集合中添加元素
a.update([3,4])
>> print(a)
{1, 2, 3, 4}
如果要添加元组或冻结集本身,请使用 add
a.add((5, 6))
>> print(a)
{1, 2, 3, 4, (5, 6)}
注意:由于集合元素必须是可散列的,并且列表被认为是可变的,因此您不能将列表添加到集合中。您也不能将其他集添加到集。但是,您可以按照“.update”方法的演示从列表和集合中添加元素。
【讨论】:
我喜欢这样做的方式是将原始集合和我想添加的值转换为列表,添加它们,然后将它们转换回集合,如下所示:
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'}
通过这种方式,我还可以使用相同的逻辑轻松添加多个集合,如果我尝试使用 .update() 方法进行操作,我会得到一个 TypeError: unhashable type: 'set'。
【讨论】:
big_set = my_sets[0].union(*my_sets[1:])
keep.update((0,1,2,3,4,5,6,7,8,9,10))
或者
keep.update(np.arange(11))
【讨论】:
对我来说,在 Python 3 中,它的工作方式很简单:
keep = keep.union((0,1,2,3,4,5,6,7,8,9,10))
不知道对不对……
【讨论】:
您还可以使用| 运算符连接两个集合(集合论中的联合):
>>> my_set = {1}
>>> my_set = my_set | {2}
>>> my_set
{1, 2}
或者使用|=的更短形式:
>>> my_set = {1}
>>> my_set |= {2}
>>> my_set
{1, 2}
注意:在 Python 2.7 之前的版本中,使用 set([...]) 而不是 {...}。
【讨论】:
my_sets,那么你可以用big_set = my_sets[0].union(*my_sets[1:])把它们全部组合起来
这个问题是第一个出现在 Google 上的问题,当人们查找“Python 如何将元素添加到集合”时,因此值得注意的是,如果你想将整个字符串添加到集合中,它应该是添加.add(),而不是.update()。
假设您有一个字符串foo_str,其内容为'this is a sentence',并且您有一些集合bar_set 等于set()。
如果你这样做
bar_set.update(foo_str),你设置的内容将是{'t', 'a', ' ', 'e', 's', 'n', 'h', 'c', 'i'}。
如果您使用bar_set.add(foo_str),则您的集合的内容将为{'this is a sentence'}。
【讨论】:
像这样使用update:
keep.update(newvalues)
【讨论】:
keep.update(yoursequenceofvalues)
例如,keep.update(xrange(11)) 用于您的具体示例。或者,如果您出于某种原因必须在循环中生成值,
for ...whatever...:
onemorevalue = ...whatever...
keep.add(onemorevalue)
当然,如果可行的话,通过单个 .update 调用批量执行此操作会更快、更方便。
【讨论】:
.add 添加单个项目,.update 添加多个项目。对吗?
.add 需要一个可散列类型,而 .update 需要一个可迭代对象
.add,而不是.update,由于这个小细节,我最近遇到了一个相当狡猾的错误。
add和update改变set对象,可以调用{*a, *b}返回一个新的set对象