迭代潜在的生成器

643ylb08  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(332)

我需要遍历pandas.series对象流(我想使用的对象类型与此无关)。可选地,对每个序列应用一个任意函数,并且-这里是clincher-这个任意函数可以是生成函数,生成两个(或更多)值。我对未来充满希望 more_itertools.flatten 函数,但它没有帮助,因为它会在常规函数或没有函数Map到生成器时中断。有没有办法把这个iterable变成一个简单的系列对象生成器?下面是一个简单的例子,说明了这个问题:

  1. In [1]: from more_itertools import flatten
  2. ...:
  3. ...: def generator():
  4. ...: for i in range(10):
  5. ...: yield i
  6. ...:
  7. ...: def postprocess1(i):
  8. ...: yield 2*i
  9. ...:
  10. ...: def postprocess1_return(i):
  11. ...: return 2*i
  12. ...:
  13. ...: def postprocess2(i):
  14. ...: yield from (i, 2*i)
  15. ...:
  16. In [2]: list(generator())
  17. ...:
  18. Out[2]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  19. In [3]: list(map(postprocess1, generator()))
  20. ...:
  21. Out[3]:
  22. [<generator object postprocess1 at 0x7f5a402916d0>,
  23. <generator object postprocess1 at 0x7f5a40291e40>,
  24. <generator object postprocess1 at 0x7f5a40291f20>,
  25. <generator object postprocess1 at 0x7f5a40291dd0>,
  26. <generator object postprocess1 at 0x7f5a40291eb0>,
  27. <generator object postprocess1 at 0x7f5a40209040>,
  28. <generator object postprocess1 at 0x7f5a40209190>,
  29. <generator object postprocess1 at 0x7f5a402092e0>,
  30. <generator object postprocess1 at 0x7f5a402090b0>,
  31. <generator object postprocess1 at 0x7f5a40209350>]
  32. In [4]: list(map(postprocess1_return, generator()))
  33. ...:
  34. Out[4]: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
  35. In [5]: list(map(postprocess2, generator()))
  36. ...:
  37. Out[5]:
  38. [<generator object postprocess2 at 0x7f5a403ad430>,
  39. <generator object postprocess2 at 0x7f5a40209580>,
  40. <generator object postprocess2 at 0x7f5a402097b0>,
  41. <generator object postprocess2 at 0x7f5a40209510>,
  42. <generator object postprocess2 at 0x7f5a40209430>,
  43. <generator object postprocess2 at 0x7f5a40209740>,
  44. <generator object postprocess2 at 0x7f5a402096d0>,
  45. <generator object postprocess2 at 0x7f5a40209820>,
  46. <generator object postprocess2 at 0x7f5a40209660>,
  47. <generator object postprocess2 at 0x7f5a40209890>]
  48. In [6]: list(flatten(generator()))
  49. ...:
  50. ---------------------------------------------------------------------------
  51. TypeError Traceback (most recent call last)
  52. <ipython-input-6-7cd770547fa4> in <module>
  53. ----> 1 list(flatten(generator()))
  54. TypeError: 'int' object is not iterable
  55. In [7]: list(flatten(map(postprocess1, generator())))
  56. ...:
  57. Out[7]: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
  58. In [8]: list(flatten(map(postprocess1_return, generator())))
  59. ...:
  60. ---------------------------------------------------------------------------
  61. TypeError Traceback (most recent call last)
  62. <ipython-input-8-35ce9aef7285> in <module>
  63. ----> 1 list(flatten(map(postprocess1_return, generator())))
  64. TypeError: 'int' object is not iterable
  65. In [9]: list(flatten(map(postprocess2, generator())))
  66. Out[9]: [0, 0, 1, 2, 2, 4, 3, 6, 4, 8, 5, 10, 6, 12, 7, 14, 8, 16, 9, 18]
cunj1qz1

cunj1qz11#

我想出来了: more_itertools.collapse(generator, base_type=pd.Series) 真有办法!
显然,基本值的类型实际上很重要:没有 base_type=pd.Series 在我的实际代码中,a系列的所有元素都一个接一个地生成,这不是我想要的。

相关问题