当前位置: 首页 > 面试题库 >

过滤对象在迭代后变为空?

长孙景天
2023-03-14
问题内容

我正在学习如何使用该filter功能。

这是我编写的代码:

people = [{'name': 'Mary', 'height': 160},
          {'name': 'Isla', 'height': 80},
          {'name': 'Sam'}]

people2 = filter(lambda x: "height" in x, people)

如您所见,我正在尝试删除所有不包含'height'键的字典。

该代码正常工作,实际上如果我这样做:

print(list(people2))

我得到:

[{'name': 'Mary', 'height': 160}, {'name': 'Isla', 'height': 80}]

问题是,如果我做两次:

print(list(people2))
print(list(people2))

第二次,我得到一个空清单。

你能解释一下为什么吗?


问题答案:

这是经典的python3 doh!。

过滤器是可以迭代的特殊可迭代对象。但是,就像生成器一样,您只能对其迭代一次。因此,通过调用list(people2),您可以遍历filter对象的每个元素以生成list。至此,您已经到达了迭代的尽头,仅此而已。

因此,当您list(people2)再次致电时,您会得到一个空列表。

演示:

>>> l = range(10)
>>> k = filter(lambda x: x > 5, l)
>>> list(k)
[6, 7, 8, 9]
>>> list(k)
[]

我应该提到python2,它filter返回一个列表,所以您不会遇到这个问题。当您将py3的惰性评估带入图片时,就会出现问题。



 类似资料:
  • 问题内容: 假设我有一个异步可迭代对象,可以使用来传递它,然后又如何将其映射并过滤到新的异步迭代器上?以下代码是对我如何使用同步可迭代方法执行相同操作的适应,因此不起作用,因为s内部不允许这样做。 问题答案: 一个最近公布的PEP草案(PEP 525) ,其支持定为Python 3.6 ,建议允许异步发电机与你想出了相同的语法。 同时,如果您不想处理异步迭代器样板,还可以使用CryingCyclo

  • 问题 你有一系列排序序列,想将它们合并后得到一个排序序列并在上面迭代遍历。 解决方案 heapq.merge() 函数可以帮你解决这个问题。比如: >>> import heapq >>> a = [1, 4, 7, 10] >>> b = [2, 5, 6, 11] >>> for c in heapq.merge(a, b): ... print(c) ... 1 2 4 5 6 7

  • 我目前正在努力迭代从第三方API获取的JSON对象。您可能会看到,以前没有真正处理过获取API。 这是我正在获取的JSON文件: 链接到JSON文件 为了获取数据,我使用一个useFetch脚本,它看起来像这样: 我稍后尝试导出的只是每个角色/冠军的名称(他本身就是一个对象,包括名称、描述等) 不幸的是,我在尝试转换JSON对象表示:

  • 问题内容: 有没有一种方法来获取数组的迭代器?像这样: 问题答案: 您可以使用: 它只是将数组包装在列表实现中,以便您可以在其上调用方法。 请注意,这种方法仅适用于对象数组。对于原始数组,您将必须实现自己的迭代器(例如,使用匿名类)。 从Java 8开始,您还可以使用开箱即用的迭代器(并且如果是或,也可以使此代码进行编译: 尽管您将无法使用原始数据类型,并且因为没有相应的流实现。但是,您可以使用以

  • Apache Commons Collections库的CollectionUtils类为常见操作提供了各种实用方法,涵盖了广泛的用例。 它有助于避免编写样板代码。 这个库在jdk 8之前非常有用,因为Java 8的Stream API现在提供了类似的功能。 使用filter()方法过滤列表 CollectionUtils的filter()方法可用于过滤列表以删除不满足传递的谓词提供的条件的对象。

  • 我想要得到一个这样的对象: 通过这样编码: 但我总是得到以下几点: