我有很多标签,我通过以下方式制作:
unique_train_labels = set(train_property_labels)
打印出set([u'A', u'B', u'C'])
。我想用一个名为“no_region”的新标签创建一组新的唯一标签,并使用:
unique_train_labels_threshold = unique_train_labels.add('no_region')
但是,这打印为None
。
我的最终目标是使用这些独特的标签,以后通过以下方式生成随机数组的分类标签:
rng = np.random.RandomState(101)
categorical_random = rng.choice(list(unique_train_labels), len(finalTestSentences))
categorical_random_threshold = rng.choice(list(unique_train_labels_threshold), len(finalTestSentences))
从docs它说set.add()
应该生成一个新的集合,但似乎不是这种情况(因此我以后不能调用list(unique_train_labels_threshold)
)
答案 0 :(得分:4)
set add
方法会改变集合 inplace 并返回None
。
你应该这样做:
unique_train_labels_threshold = unique_train_labels.copy()
unique_train_labels_threshold.add('no_region')
使用copy
确保新集合上的突变不会传播到旧集合。
答案 1 :(得分:4)
正如摩西所提到的那样。回答,set.add
方法改变原始集合,它不会创建新集合。在Python中,它是执行就地突变以返回None
的方法的常规方法;所有内置可变类型的方法都可以做到这一点,并且通常由第三方库来遵守约定。
使用.copy
方法的另一种方法是使用.union
方法,该方法返回一个新集合,该集合是原始集合和作为参数提供的集合的并集。对于集合,|
或运算符会调用.union
方法。
a = {1, 2, 3}
b = a.union({5})
c = a | {4}
print(a, b, c)
<强>输出强>
{1, 2, 3} {1, 2, 3, 5} {1, 2, 3, 4}
.union
方法(与可以通过运算符语法调用的其他set方法一样)与运算符语法相比略有优势:您可以为其参数传递任何 iterable;运算符版本要求您将参数显式转换为集合(或冻结集)。
a = {1, 2, 3}
b = a.union([5, 6])
c = a | set([7, 8])
print(a, b, c)
输出
{1, 2, 3} {1, 2, 3, 5, 6} {1, 2, 3, 7, 8}
使用显式.union
方法在这里稍微有效,因为它绕过了将arg转换为set:在内部,该方法只是遍历arg的内容,将它们添加到新集合中,因此它不会#39; t关心arg是否为set,list,tuple,string或dict。
来自官方Python set docs
注意,union(),intersection()的非运算符版本, difference()和symmetric_difference(),issubset()和issuperset() 方法将接受任何iterable作为参数。相比之下,他们的 基于运营商的对应者要求他们的参数是集合。这个 排除容易出错的结构,例如set(&#39; abc&#39;)&amp; &#39; CBS&#39;赞同,支持,受赏识,有利 更可读的集合(&#39; abc&#39;)。交集(&#39; cbs&#39;)。
答案 2 :(得分:0)
我无法在文档中找到add
生成新集的任何内容
您需要复制原件,然后添加到新副本。
import copy
unique_train_labels_threshold = copy.deepcopy(unique_train_labels)
unique_train_labels_threshold.add('no_region')