无法一步一步扩展列表并采用set,而不会出现Non-Iterable错误

问题描述

我正在尝试管理一个唯一项列表,这些唯一项可能(也可能不会)在每次循环迭代中添加。也许它们只是由doSomething(someData)产生的整数。

因此,每次迭代时,我都调用doSomething,并希望将结果添加到不断增长的列表中...

   uniqs = []
   for md in mydata:
       newOnes = doSomething(md)                   # returns a list eg [3,2,3]
       uniqs = list(set(uniqs.extend(newOnes)))    # keep only uniquely new items

但是看来我不能同时进行扩展和设置而没有错误

TypeError: 'nonetype' object is not iterable

我可以分两步完成

   uniqs = []
   for md in mydata:
       newOnes = doSomething(md)        # returns a list eg [3,3]
       uniqs.extend(newOnes)            # extend the list will all new items
       uniqs = list(set(uniqs))         # keep only unique items

但是我以为那行就可以了,因为extend()将在应用set()之前发生。不确定为什么不是这样。

有人可以说明为什么吗?

-罗斯

解决方法

如果您很高兴uniqs是一个集合而不是一个列表,则可以使用update遍历该列表并添加任何尚不存在的元素:

   uniqs = set()
   for md in mydata:
       newOnes = doSomething(md)
       uniqs.update(newOnes)

如果需要,可以将其转换为以uniqs = list(uniqs)结尾的列表。顺序将是不确定的,但是由于您已经在计算中使用集合作为中间变量,所以已经是这种情况了。

您也许可以使用functools.reduce将以上内容写为单行代码:

functools.reduce(set.union,(set(doSomething(md)) for md in mydata))

尽管显式循环可能更具可读性。