分入时隙 - 有没有比使用list comp更好的方法?

mal*_*ngi 5 python

我有一个事件数据集(特定的推文),我试图进行bin/discretize.以下代码似乎到目前为止工作正常(假设100个bin):

HOUR = timedelta(hours=1)
start = datetime.datetime(2009,01,01)
z = [dt + x*HOUR for x in xrange(1, 100)]
Run Code Online (Sandbox Code Playgroud)

但后来,我在python docs遇到了这个命运的路线'这使得有可能成为使用zip(*[iter(s)]*n)' 将数据系列聚类成n长度组的成语.拉链成语确实有效 - 但我无法理解(*例如运营商是什么?).我怎么能用来使我的代码更漂亮?我猜这意味着我应该制作一个发生器/可迭代的时间,即yields一个小时的毕业时间?

sth*_*sth 5

文档中的表达式如下所示:

zip(*[iter(s)]*n)
Run Code Online (Sandbox Code Playgroud)

这相当于:

it = iter(s)
zip(*[it, it, ..., it]) # n times
Run Code Online (Sandbox Code Playgroud)

[...]*n重复列表n的时间,这会导致一个包含列表n相同的迭代器引用.

这再次等于:

it = iter(s)
zip(it, it, ..., it)    # turning a list into positional parameters
Run Code Online (Sandbox Code Playgroud)

*列表之前把列表元素融入到函数调用的位置参数.

现在,当调用zip时,它从左到右开始调用迭代器以获取应该组合在一起的元素.由于所有参数都引用相同的迭代器,因此产生n初始序列的第一个元素.然后,对于结果列表中的第二个组继续该过程,依此类推.

结果就像你构建了这样的列表一样(从左到右计算):

it = iter(s)
[(it.next(), it.next(), ..., it.next()), (it.next(), it.next(), ..., it.next()),  ...]
Run Code Online (Sandbox Code Playgroud)


mik*_*kej 5

我将尝试zip(*[iter(s)]*n)用一个更简单的例子来解释:

想象你有这个清单 s = [1, 2, 3, 4, 5, 6]

iter(s)为您提供一个listiterator对象,s每次请求元素时都会生成下一个数字.

[iter(s)] * n让你列表与iter(s)ñ倍,例如[iter(s)] * 2 = [<listiterator object>, <listiterator object>]-这里的关键是,这是2只引用了同一个迭代器对象,而不是2个不同的迭代器对象.

zip获取许多序列并返回元组列表,其中每个元组包含来自每个序列的第i个元素.例如 zip([1,2], [3,4], [5,6]) = [(1, 3, 5), (2, 4, 6)]其中(1, 3, 5)是从传递给参数的第一元件zip(2, 4, 6)从传递给参数的第二元件zip.

*前面*[iter(s)]*n转换[iter(s)]*n从一个列表应运而生多个参数被传递到zip.所以,如果n是2,我们得到zip(<listiterator object>, <listiterator object>)

zip将从它的每个参数请求下一个元素,但因为它们都是对同一个迭代器的引用,这将导致(1, 2),它再次相同,导致(3, 4)并再次产生(5, 6),然后没有更多的元素,所以它停止.因此结果[(1, 2), (3, 4), (5, 6)].如上所述,这是将数据序列聚类成n长度组.