Python 将数据合并到时间段-有没有比使用列表比较更好的方法?
我有一个事件数据集(具体来说是推特),我正试图对其进行分类/离散化。到目前为止,以下代码似乎运行良好(假设有100个箱子):Python 将数据合并到时间段-有没有比使用列表比较更好的方法?,python,Python,我有一个事件数据集(具体来说是推特),我正试图对其进行分类/离散化。到目前为止,以下代码似乎运行良好(假设有100个箱子): 但后来,我在python文档中遇到了这一致命的一行:“这使得使用zip(*[iter(s)]*n)”将数据系列聚类成n个长度组成为可能。”。zip这个习惯用法确实有效——但我不明白它是如何工作的(例如,*操作符是什么?)。我怎样才能使我的代码更漂亮?我猜这意味着我应该使生成器/iterable用于产生以小时为单位的时间?文档中的表达式如下所示: zip(*[iter(s)
但后来,我在python文档中遇到了这一致命的一行:“这使得使用
zip(*[iter(s)]*n)
”将数据系列聚类成n个长度组成为可能。”。zip这个习惯用法确实有效——但我不明白它是如何工作的(例如,*
操作符是什么?)。我怎样才能使我的代码更漂亮?我猜这意味着我应该使生成器/iterable用于产生以小时为单位的时间?文档中的表达式如下所示:
zip(*[iter(s)]*n)
这相当于:
it = iter(s)
zip(*[it, it, ..., it]) # n times
[…]*n
重复列表n
次,这将导致列表包含对同一迭代器的n
引用
这同样等于:
it = iter(s)
zip(it, it, ..., it) # turning a list into positional parameters
列表前的*
将列表元素转换为函数调用的位置参数
现在,当调用zip时,它从左到右开始调用迭代器以获得应该分组在一起的元素。由于所有参数都引用同一迭代器,因此这将生成初始序列的第一个n
元素。然后,对结果列表中的第二个组继续该过程,依此类推
结果与您构建的列表相同(从左到右计算):
我将尝试用一个更简单的例子来解释zip(*[iter(s)]*n)
:
假设您有一个列表s=[1,2,3,4,5,6]
iter
为您提供一个listiterator
对象,该对象将在您每次请求元素时从s
生成下一个数字
[iter(s)]*n
给出了包含iter(s)
的列表n次,例如[iter(s)]*2=[,]
-这里的关键是,这是对同一迭代器对象的两个引用,而不是两个不同的迭代器对象
zip
获取大量序列并返回元组列表,其中每个元组包含每个序列中的第i个元素。e、 g.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(,)
zip
将从其每个参数中请求下一个元素,但由于这两个元素都是对同一迭代器的引用,这将导致(1,2)
,它再次执行相同操作,导致(3,4)
,再次导致(5,6)
,然后没有更多元素,因此它停止。因此结果[(1,2)、(3,4)、(5,6)]
。如前所述,这是将一个数据系列分为n个长度组的步骤。请参见星号。非常感谢您的详细解释,现在就有意义了!
it = iter(s)
zip(it, it, ..., it) # turning a list into positional parameters
it = iter(s)
[(it.next(), it.next(), ..., it.next()), (it.next(), it.next(), ..., it.next()), ...]