我有一个随机数字的列表。
nums = [5, 7, 1, 5, 6, 2, 7, 8, 2, 1, 1, 4, 6]
本质上,我想将每个数字都乘以2,如果它是两位数,则将其从列表中过滤出来并存储在另一个列表中。我知道如何迭代地执行此操作,但是,我想知道是否有任何有趣的方法可以执行此操作。就像使用filter()或其他尝试一样。
现在我有这个:
nums = list(map(lambda x: x * 2, nums)) # multiplies each number by two
nums = list(filter(lambda x: x < 10, nums)) # keeps only single digit numbers
现在,我如何获得被过滤掉的数字(大于9)?我知道您总是可以将列表复制到新列表中,然后执行两个单独的过滤器以获取如下答案:
nums = list(map(lambda x: x * 2, nums))
temp = nums
nums = list(filter(lambda x: x < 10, nums))
temp = list(filter(lambda x: x >= 10, temp))
但是,有一种方法可以执行此操作,而不必复制列表并使用额外的内存。我不确定是否有一些非常简单的解决方案正在解决。我是新手,感谢您的帮助。
答案 0 :(得分:4)
我发现列表推导比python中的map和filter更清晰易读。
nums = [5, 7, 1, 5, 6, 2, 7, 8, 2, 1, 1, 4, 6]
nums1 = [2*x for x in nums if x < 5]
nums2 = [2*x for x in nums if x >= 5]
答案 1 :(得分:1)
在python3
中,只需使用filter
和map
对象而无需转换为中间列表,itertools.tee
也可能会派上用场:
>>> import itertools
>>> nums = [5, 7, 1, 5, 6, 2, 7, 8, 2, 1, 1, 4, 6]
>>> n1, n2 = itertools.tee(map(lambda x: x * 2, nums))
>>> print(list(filter(lambda x: x < 10, n1)))
[2, 4, 4, 2, 2, 8]
>>> print(list(filter(lambda x: x >= 10, n2)))
[10, 14, 10, 12, 14, 16, 12]
>>> next(n1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> next(n2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
检查tee
是否制作了可以被使用的迭代器的副本。
编辑:
从tee
文档中,@ Tomothy32在评论中指出:
”,如果一个迭代器在另一个迭代器之前使用了大部分或全部数据 开始,使用list()而不是tee()更快。”
因此,在这种情况下,内存开销可能更快
答案 2 :(得分:0)
我想我可能已经完成了您想要的。我刚刚重命名了您试图检索大于10的数字的函数。
greater = nums = list(filter(lambda x: x >= 10, nums))