对象的附加对象是`NoneType` python 2.7

时间:2016-07-22 13:26:22

标签: python python-2.7 numpy random set

我有很多标签,我通过以下方式制作:

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)

3 个答案:

答案 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')