python - 列表理解中的python可迭代列表理解
问题描述
我试图弄清楚为什么我的嵌套列表理解不起作用。代码:
def myzip(*args):
try:
x = [iter(i) for i in [*args]]
while True:
# for i in range(5):
yield [next(ii) for ii in x]
# I want to know why the commented line below won't work
# yield [next(ii) for ii in [iter(i) for i in [*args]]]
# or why this outputs [1, 'a']
# return [next(ii) for ii in [iter(i) for i in [*args]]]
except:
pass
def main():
print(list(myzip([1, 2, 3, 4, 5], ['a', 'b', 'c'])))
if __name__ == '__main__':
main()
如果我分配[iter(i) for i in [*args]]
给x
然后使用这个列表理解[next(ii) for ii in x]
一切正常。输出将是:
[[1, 'a'], [2, 'b'], [3, 'c']]
但是,如果我尝试省略变量x
并在一个更大的列表理解(注释行)中执行[next(ii) for ii in [iter(i) for i in [*args]]]
它,它会进入无限循环。如果将无限循环替换为 for 循环(注释行),则输出为:
[[1, 'a'], [1, 'a'], [1, 'a'], [1, 'a'], [1, 'a']]
此外,如果我尝试return [next(ii) for ii in [iter(i) for i in [*args]]]
它只会返回:
[1, 'a']
有人能告诉我这是为什么吗?
解决方案
所以我不会直接回答你的问题(因为评论很好地涵盖了这一点),但我将展示如何将其作为一个可怕的单线来完成,只是为了好玩:
def my_zip(*args):
yield from iter(lambda data=[iter(a) for a in args]: [next(d) for d in data], None)
有三个部分。
iter
, after的第一次使用yield from
创建了一个callable_iterator
. 这将重复调用它的第一个参数(thelambda
),直到它看到它的第二个参数(sentinel 值,在这种情况下None
)或者它遇到任何异常时遇到StopIteration
错误。(在这种情况下,这将是一个StopIteration
例外。- 在
lambda
i 中有一个默认值,data
它是您要迭代的迭代器的列表。this 被创建一次,因此每次对该函数的调用都将引用 this。 - 最后,在正文中
lambda
,我在每个函数调用中手动推进每个迭代器data
一次。这将一直持续到其中一个迭代器用尽,此时StopIteration
将引发 a。正如您所看到的,在这种情况下,哨兵值无关紧要,因为第一次这将冒泡到iter
调用将在它得到它时立即保释,StopIteration
list
消费者,导致它停止迭代。由于异常,哨兵值无关紧要。
最后:请永远不要在实际代码中实际执行此操作。
编辑:一些示例输出
In [90]: list(my_zip('abcd', [1,2,3]))
Out[90]: [['a', 1], ['b', 2], ['c', 3]]
In [91]: list(my_zip('abcd', [1,2,3,4,5,6]))
Out[91]: [['a', 1], ['b', 2], ['c', 3], ['d', 4]]
解释编辑:向@superb rain 致敬,感谢他们在下面的聪明评论。
推荐阅读
- java - 处理 3 三角形未显示在 Javafx 8 窗口选项卡中
- javascript - 我需要创建一个节点 js 脚本,它将读取一个文本文件并输出一个图形。我该怎么做呢?
- c# - 为什么 Unity3D 中会出现 cs0433 错误?我该如何解决?
- git - 提交后,重置头部然后签出提交,git不会恢复删除的文件
- python - conda 环境在 conda env 列表中没有可见的名称 - 如何在 shell 中激活它?
- coq - 证明过程忙于 combine_split
- spring - 如何以编程方式覆盖spring环境变量
- c# - 如何检索 USB 设备的名称
- c++ - tm_wday 返回一个 0-6 范围之外的大整数
- python - 股票利润最大化:给定价格数组,如何通过边界最大化利润