问题描述
我正在尝试管理一个唯一项列表,这些唯一项可能(也可能不会)在每次循环迭代中添加。也许它们只是由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))
尽管显式循环可能更具可读性。