Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将数据合并到时间段-有没有比使用列表比较更好的方法?_Python - Fatal编程技术网

Python 将数据合并到时间段-有没有比使用列表比较更好的方法?

Python 将数据合并到时间段-有没有比使用列表比较更好的方法?,python,Python,我有一个事件数据集(具体来说是推特),我正试图对其进行分类/离散化。到目前为止,以下代码似乎运行良好(假设有100个箱子): 但后来,我在python文档中遇到了这一致命的一行:“这使得使用zip(*[iter(s)]*n)”将数据系列聚类成n个长度组成为可能。”。zip这个习惯用法确实有效——但我不明白它是如何工作的(例如,*操作符是什么?)。我怎样才能使我的代码更漂亮?我猜这意味着我应该使生成器/iterable用于产生以小时为单位的时间?文档中的表达式如下所示: zip(*[iter(s)

我有一个事件数据集(具体来说是推特),我正试图对其进行分类/离散化。到目前为止,以下代码似乎运行良好(假设有100个箱子):


但后来,我在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()),  ...]