如何从列表中过滤项目并将其存储在另一个列表中?

时间:2019-04-11 02:30:13

标签: python

我有一个随机数字的列表。

   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))

但是,有一种方法可以执行此操作,而不必复制列表并使用额外的内存。我不确定是否有一些非常简单的解决方案正在解决。我是新手,感谢您的帮助。

3 个答案:

答案 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中,只需使用filtermap对象而无需转换为中间列表,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))