gpt4 book ai didi

python - 这个函数有什么作用? (Python 迭代器)

转载 作者:太空狗 更新时间:2023-10-30 00:31:48 24 4
gpt4 key购买 nike

def partition(n, iterable):
p = izip_longest(*([iter(iterable)] * n))
r = []
for x in p:
print(x) #I added this
s = set(x)
s.discard(None)
r.append(list(s))
return r

这实际上是在 SO 上发布的职位,作为新手,我认为这很有趣。所以你得到如下输出:

partition(5, L)
(1, 2, 3, 4, None)
Out[86]: [[1, 2, 3, 4]]

对我来说这已经令人困惑了,因为我认为 izip_longest(*([iter(iterable)] * n)) 会在 n 的列表上运行 izip_longest 函数相同的迭代器,所以我希望首先输出 (1,1,1,1,1) 然后输出 (2,2,2,2,2)等等。

我的问题的简短版本是这一行发生了什么:

 p = izip_longest(*([iter(iterable)] * n))

解析它我会认为 [iter(iterable)]*n 创建了一个长度为 n 的列表,其中包含相同的可迭代对象,它们都指向同一事物——这就是它在命令行上所做的,但似乎不是它根据上面打印的输出在这里做什么。

我还认为 * 在开头 ...longest(*... 因为列表的长度未知但我认为这不完全有意义。那是什么第一个 * 符号在函数调用中做什么?它似乎不只是表示一个未知长度的参数列表...

所以在一天结束的时候我完全迷路了。有人可以指导我完成这个语法吗?

非常感谢任何输入!


感谢大家提供的所有有用的答案。我不确定我是在解决答案还是问题,但在我看来,这个列表理解对列表和元组会做同样的事情(我意识到迭代器也适用于字典、自定义类和其他东西...... .)

[L[i*n:(i+1)*n] for i in range(int(ceil(len(L)/float(n)))) ]

最佳答案

给定:

>>> li
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

有一个常见的 Python 习语使用 zip结合iter* operator将一个平面列表划分为一个长度为 n 的列表:

>>> n=3
>>> zip(*([iter(li)] * n))
[(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11), (12, 13, 14), (15, 16, 17), (18, 19, 20)]

但是,如果 n 不是总长度的偶数倍,则最终列表将被截断:

>>> n=4
>>> zip(*([iter(li)] * n))
[(0, 1, 2, 3), (4, 5, 6, 7), (8, 9, 10, 11), (12, 13, 14, 15), (16, 17, 18, 19)]

您可以使用 izip_longest为不完整的子列表使用用选定值填充的完整列表:

>>> list(izip_longest(*([iter(li)] * n)))
[(0, 1, 2, 3), (4, 5, 6, 7), (8, 9, 10, 11), (12, 13, 14, 15), (16, 17, 18, 19), (20, None, None, None)]

关于python - 这个函数有什么作用? (Python 迭代器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30379560/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com