从元组中删除None

5
以前有关如何从列表中删除None的答案对我没有帮助! 我正在创建一个元组列表,其中包含:
list(zip(*[iter(pointList)] *3))

那么我所拥有的是

[(object1,object2,object3),(object4,object5,object6),(object7,None,None)]

或者

[(object1,object2,object3),(object4,object5,object6),(object7,object8,None)]

我希望你能够移除元组中的None值(这些值只会出现在列表的最后一个条目中!)。所以我的期望输出结果是:

[(object1,object2,object3),(object4,object5,object6),(object7)]

或者

[(object1,object2,object3),(object4,object5,object6),(object7,object8)]

我认为会帮助我的是:

filter(None,myList)

你能展示一下你尝试过什么吗? - glibdud
3
元组是不可变的 - 你不能直接在原地修改它们。 - CodeCupboard
那么我必须另外构建我的列表吗? - greedsin
1个回答

12

元组是不可变的,因此一旦你构造了一个元组,你就无法更改它的长度或设置其元素。因此,你唯一的选择是在后处理步骤中构造新的元组,或者根本就不生成这些元组。

后处理

只需在列表推导式语句中使用带有tuple(..)构造函数的生成器:

[tuple(xi for xi in x if xi is not None) for x in data]

更改“打包”算法

在这里,“打包”指的是将一个 m×n 项的列表转换为 n 个由 m 个元素组成的“切片”(这是您第一个代码片段所做的操作)。

如果 - 如变量名所示 - pointList 是一个列表,您可以避免使用 zip,并采用以下方式处理:

[tuple(pointList[i:i+3]) for i in range(0,len(pointList),3)]
直接这样做可能会更有效率,因为在这里我们从未生成第一个元素是None的元组(当然,假设postList中没有None)。

很高兴听到这个消息,我之前不知道这个(只有Java背景),我会尝试一下。 - greedsin
看起来这个不行因为我简化了我的问题,实际上我没有可迭代的对象。 - greedsin
@lolio:但是data是您的list(..)语句的输出。 - Willem Van Onsem
1
更新后的答案完美无缺,我会在几分钟内接受! - greedsin
注意,itertools.zip_longest 似乎默认添加 'None'(实际上并不是)但很难“排除” - 看来后处理是这种方法的唯一解决办法。这是正确的吗?还是我误用了 itertools.zip_longest? - lb_so

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接