Python使用iterable设置更新

Cht*_*ect 0 python iterable set

我手边有一个体面大小的文本文件(~23MB).我正在逐行读取文件,并根据一些外部标准从每行中提取几个单词.为了这个例子,让我们说每行包含至少六个以制表符分隔的值,除了第一个和最后一个之外,我正在接收所有这些值.

我想输出以这种方式获得的一组唯一单词,所以显然我想将提取的单词存储在一个set.此外,由于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)
Run Code Online (Sandbox Code Playgroud)

这很好用.但是当我替换all_words.update(wordlist)时all_words |= wordlist,我得到以下错误:

TypeError: unsupported operand type(s) for |=: 'set' and 'list'
Run Code Online (Sandbox Code Playgroud)

从文档中,我理解update并且|=是等效的.此外,因为|=应该接受任何迭代,我也通过这样做证实:

import collections
isinstance(wordlist, collections.Iterable)        # returns True
Run Code Online (Sandbox Code Playgroud)

为什么第一种方法使用set.update工作,而不是第二种方法使用|=?

Ign*_*ams 5

从文档中,我了解更新和| =是等效的.此外,因为| =应该接受任何迭代...

从文档:

需要注意的的非运营商的版本update(),intersection_update(),difference_update(),和symmetric_difference_update()方法会接受任何迭代器作为参数.

文档似乎不符合您的理解.


use*_*342 5

set方法如update接受任意可迭代对象,而set操作符如|和|=需要集合。

引用文档:

值得注意的是,非运营商的版本union(),intersection(), difference(),和symmetric_difference(),issubset()和issuperset() 方法将接受任何可迭代作为参数。相比之下,它们的基于运算符的对应物需要设置它们的参数。这排除了容易出错的结构,例如set('abc') & 'cbs'支持更具可读性的set('abc').intersection('cbs').