在Python中使用zip函数时,如何跳过创建具有特定值的元组?

时间:2014-02-27 22:06:08

标签: python tuples

我在Python中使用zip()函数。

我正在压缩两个列表,但是,某些列表中包含值0。我想避免使用零中的任何元组。

x = [1, 2, 3]
y = [0, 0, 6]
zipped = zip(x, y)
>>> zipped
[(3, 6)]

在尝试解决这个问题的过程中,我也意识到任何可能的解决方案可能会很慢,如果它涉及拉链然后移除。

有没有办法在拉链上加入条件?或者我应该探索一种不同的,更快的方法吗?

非常感谢任何建议。

2 个答案:

答案 0 :(得分:2)

您可以izip并且只传递正确的值:

from itertools import izip
zipped = [(xx, yy) for xx, yy in izip(x, y) if yy]

我选择izip超过zip的原因是因为在python2.x中,zip会生成一个真正没有必要的新列表。 izip避免了这种开销。

在python3.x中,内置zip没有此列表实现行为,因此您应该使用它。 (事实上​​,itertools.izip甚至不存在于python3.x中)

答案 1 :(得分:2)

zip()本身不会涵盖这一特定要求。不过,您可以将它与列表推导一起使用以获得所需的结果:

>>>x = [1, 2, 3]
>>>y = [0, 0, 6]
>>>zipped = [(a,b) for a,b in zip(x,y) if a and b]
>>>zipped
[(3,6)]

关于此方法的速度。它会比使用循环创建的任何新解决方案快得多,因为在这种情况下循环在C中本地执行,这比Python的循环更快。