使用iterable更新Python集

使用iterable更新Python集,python,set,iterable,Python,Set,Iterable,我手头有一个相当大的文本文件(~23MB)。我正在逐行阅读文件,并根据一些外部标准从每行中提取一些单词。在本例中,假设每一行包含至少六个制表符分隔的值,我将拾取除第一个和最后一个之外的所有值 我想输出以这种方式获得的唯一单词集,因此显然我想将提取的单词存储在集中。另外,由于set.update(other)比通过other循环并使用set.add(elem)一次添加一个单词要快得多,因此我尝试这样做: all_words = set() with open(my_tsv_file) as tsv

我手头有一个相当大的文本文件(~23MB)。我正在逐行阅读文件,并根据一些外部标准从每行中提取一些单词。在本例中,假设每一行包含至少六个制表符分隔的值,我将拾取除第一个和最后一个之外的所有值

我想输出以这种方式获得的唯一单词集,因此显然我想将提取的单词存储在
集中。另外,由于
set.update(other)
比通过
other
循环并使用
set.add(elem)
一次添加一个单词要快得多,因此我尝试这样做:

all_words = set()
with open(my_tsv_file) as tsv_file:
    for line in tsv_file:
        wordlist = based_on_some_criteria(line)    # this is a list, not a set
        all_words.update(wordlist)
import collections
isinstance(wordlist, collections.Iterable)        # returns True
这个很好用。但是当我用
all_words |=wordlist
替换
all_words.update(wordlist)
时,我得到了以下错误:

TypeError: unsupported operand type(s) for |=: 'set' and 'list'
从文档中,我了解到
update
|=
是等效的。此外,由于
|=
应该接受任何iterable,因此我也通过这样做来确认:

all_words = set()
with open(my_tsv_file) as tsv_file:
    for line in tsv_file:
        wordlist = based_on_some_criteria(line)    # this is a list, not a set
        all_words.update(wordlist)
import collections
isinstance(wordlist, collections.Iterable)        # returns True
为什么第一种方法使用的是
set.update
,而第二种方法使用的是
|=

从文档中,我了解到update和|=是等效的。此外,由于|=应该接受任何可数

从文件中:

注意,
update()
intersection\u update()
difference\u update()
、和
symmetric\u difference\u update()
方法的非运算符版本将接受任何iterable作为参数

文档似乎与您的理解不一致

从文档中,我了解到update和|=是等效的。此外,由于|=应该接受任何可数

从文件中:

注意,
update()
intersection\u update()
difference\u update()
、和
symmetric\u difference\u update()
方法的非运算符版本将接受任何iterable作为参数


文档似乎与您的理解不一致。

set
方法(如
update
)接受任意可编辑项,而
set
运算符(如
需要设置

引述:

注意,
union()
intersection()
,的非操作员版本,
difference()
,和
symmetric\u difference()
issubset()
,和
issuperset()
方法将接受任何iterable作为参数。相比之下,他们的 基于运算符的对应项要求其参数为集合。这 排除容易出错的结构,如
set('abc')和'cbs'
,以利于 更具可读性的
集合('abc')。交叉点('cbs')


set
方法,如
update
接受任意可编辑项,而
set
操作符,如
=
需要设置

引述:

注意,
union()
intersection()
,的非操作员版本,
difference()
,和
symmetric\u difference()
issubset()
,和
issuperset()
方法将接受任何iterable作为参数。相比之下,他们的 基于运算符的对应项要求其参数为集合。这 排除容易出错的结构,如
set('abc')和'cbs'
,以利于 更具可读性的
集合('abc')。交叉点('cbs')


再进一步讲,文档说,
注意,update()、intersection\u update()、difference\u update()和symmetric\u difference\u update()方法的非运算符版本将接受任何iterable作为参数。
@PM2Ring这是我在回答中引用的段落。:)不完全是。你引用的文章没有提到
update
方法家族;但那一段确实有一些有用的信息,在伊格纳西奥和我引用的那一段中被省略了(这就是为什么我给你投了赞成票)。@PM2Ring确实,你是对的。这些段落非常相似,我只是偶然引用了一篇带有附加信息的文章。谢谢你的投票。在文档上进一步说,
注意,update()、intersection\u update()、difference\u update()和symmetric\u difference\u update()方法的非运算符版本将接受任何iterable作为参数。
@PM2Ring这是我在回答中引用的段落。:)不完全是。你引用的文章没有提到
update
方法家族;但那一段确实有一些有用的信息,在伊格纳西奥和我引用的那一段中被省略了(这就是为什么我给你投了赞成票)。@PM2Ring确实,你是对的。这些段落非常相似,我只是偶然引用了一篇带有附加信息的文章。谢谢你的投票。啊!完全误解了我第一次阅读的文档。啊!在我第一次阅读时完全误解了文档。