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
Run Code Online (Sandbox Code Playgroud)
这实际上是在SO上的一个职位发布,并且是一个新手我觉得它很有趣.所以你得到如下输出:
partition(5, L)
(1, 2, 3, 4, None)
Out[86]: [[1, 2, 3, 4]]
Run Code Online (Sandbox Code Playgroud)
对我来说,这已经令人困惑,因为我认为izip_longest(*([iter(iterable)] * n))会izip_longest在n个相同迭代器的列表上运行该函数,所以我首先要预期输出(1,1,1,1,1)然后输出(2,2,2,2,2)等等.
这个问题的简短版本就是这一行:
p = izip_longest(*([iter(iterable)] * n))
Run Code Online (Sandbox Code Playgroud)
解析它我会想[iter(iterable)]*n创建一个长度为n的相同iterables的列表,它们都指向同一个东西 - 这就是它在命令行上的作用,但这似乎不是它的作用这里基于上面印刷的输出.
另外我认为开头的*...longest(*...是因为列表的长度未知,但我认为这完全没有意义.*函数调用中的第一个符号是什么?似乎它不是简单地指出一个未知长度的参数列表......
所以在一天结束的时候,我完全迷失了.有人可以告诉我这个语法吗?
非常感谢任何输入!
感谢所有有用的答案,每个人.我不确定我是否正在寻找答案或问题,但在我看来,这个列表理解将对列表和元组做同样的事情(我意识到迭代器也适用于字典,自定义类,其他东西.. .)
[L[i*n:(i+1)*n] for i in range(int(ceil(len(L)/float(n)))) ]
Run Code Online (Sandbox Code Playgroud)
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])
Run Code Online (Sandbox Code Playgroud)
是相同的
zip(my_iter,my_iter,my_iter,my_iter,my_iter)
Run Code Online (Sandbox Code Playgroud)
(splat只是解压缩列表/元组),它基本上只返回一个5xlen(my_list)//52d列表
你可以用普通的拉链简化它
#this method will have no `None` entries
new_list_partitioned = zip(*[iter(big_list)]*N) + [big_list[-(len(big_list)%N):],]
Run Code Online (Sandbox Code Playgroud)
鉴于:
>>> li
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
Run Code Online (Sandbox Code Playgroud)
有一个常见的Python习惯用法是将zip与iter和*运算符结合使用,将列表列表分成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)]
Run Code Online (Sandbox Code Playgroud)
但是,如果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)]
Run Code Online (Sandbox Code Playgroud)
您可以使用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)]
Run Code Online (Sandbox Code Playgroud)