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的相同iterables的列表,所有这些都指向同一个东西 - 这就是它在命令行上的作用,但这似乎不是它根据上面印刷的输出做了什么。
另外我认为开始...longest(*...
的*是因为列表的长度未知,但我认为这完全没有意义。在函数调用中,第一个*
符号是什么?似乎并不只是指示一个未知长度的参数列表......
所以在一天结束时我完全迷失了。有人可以告诉我这个语法吗?
非常感谢任何输入!
感谢所有有用的答案,每个人。我不确定我是否正在寻找答案或问题,但在我看来,这个列表理解将对列表和元组做同样的事情(我意识到迭代器也适用于字典,自定义类,其他东西.. 。)
[L[i*n:(i+1)*n] for i in range(int(ceil(len(L)/float(n)))) ]
答案 0 :(得分:6)
<script type="text/javascript" src="http://code.jquery.com/jquery-migrate-1.2.1.min.js"></script>
将列表转换为可迭代的(也就是看到元素被消耗的那个)
iter(my_list)
创建一个新的[my_iter]*5
列表,其中所有[my_iter,my_iter,my_iter,my_iter,my_iter]
都指向相同的迭代器
my_iter
与
相同zip(*[my_iter,my_iter,my_iter,my_iter,my_iter])
(splat只是解包一个列表/元组),它基本上只返回一个zip(my_iter,my_iter,my_iter,my_iter,my_iter)
2d列表
您可以使用普通邮件简化它
5xlen(my_list)//5
答案 1 :(得分:6)
假设:
DECLARE @BuildID bigint;
SET @BuildID = 1;
SELECT Product.Stream, Product.Strategy, Product.TopLevelPartName,
Product.ReleaseVersion, Product.MajorVersion, Product.MinorVersion, Product.BuildNumber,
AsBuiltEnvironment.Name, AsBuiltEnvironment.Value, Product.BuildTime FROM Product
INNER JOIN AsBuiltEnvironment
ON Product.BuildID = AsBuiltEnvironment.BuildID
WHERE product.BuildID=@BuildID
将zip与iter和* operator结合使用,可以将列表中的平面列表划分为n长度列表列表,这是一种常见的Python习惯用语:
>>> li
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
但是,如果>>> 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
您可以使用izip_longest来使用填写的完整列表以及未完成的子列表的选定值:
>>> 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)]