Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.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_List - Fatal编程技术网

Python:一个列表中两个位置之间的差异取决于另一个列表的规则集

Python:一个列表中两个位置之间的差异取决于另一个列表的规则集,python,list,Python,List,考虑两个长度相同的列表: t是以秒为单位的不规则时间间隔列表,按时间顺序排列 pt是数字1,2,3的序列列表,其中1后面是连续的2字符串,然后是3。 1=事件开始,2=事件继续,3=事件结束 这意味着对于单个事件,序列以单个1开始,然后是连续的2字符串(重复次数会有所不同),最后以单个3结束 此向量中包含多个事件 例如,输入可能如下所示: # |--Event #1-| |---Event #2----| |Event #3 | pt = [1, 2, 2, 3,

考虑两个长度相同的列表:

  • t
    是以秒为单位的不规则时间间隔列表,按时间顺序排列
  • pt
    是数字1,2,3的序列列表,其中1后面是连续的2字符串,然后是3。
    • 1=事件开始,2=事件继续,3=事件结束
    • 这意味着对于单个事件,序列以单个1开始,然后是连续的2字符串(重复次数会有所不同),最后以单个3结束
    • 此向量中包含多个事件
例如,输入可能如下所示:

#    |--Event #1-|   |---Event #2----|   |Event #3 | 
pt = [1, 2,  2,  3,  1,  2,  2,  2,  3,  1,  2,  3 ]
t =  [1, 10, 13, 14, 17, 20, 21, 25, 37, 32, 33, 38] 
是否有一个不涉及多个嵌套循环的1-liner,我们可以使用它为
pt
中的每个事件序列计算
t
中的时间值差异

例如,上述输入的期望输出将是一个长度为3的列表(因为有3个事件),其中输出为

Output: [13, 20, 6]

### Explanation:
# 13 = 14-1  = t[position where pt shows first 3]  - t[position where pt shows first 1]
# 20 = 37-17 = t[position where pt shows second 3] - t[position where pt shows second 1]
# 6  = 38-32 = t[position where pt shows third 3]  - t[position where pt shows third 1]
这似乎有效

pt = [1, 2,  2,  3,  1,  2,  2,  2,  3,  1,  2,  3 ]
t =  [1, 10, 13, 14, 17, 20, 21, 25, 37, 32, 33, 38] 

st = 0
lst = []
for x in zip(pt,t):
   if x[0] == 1: st = x[1]
   if x[0] == 3: 
      d = x[1] - st
      lst.append(d)

print(lst)
输出

[13, 20, 6]

使用纯python

pt=[1,2,2,3,1,2,2,3,1,2,3]
t=[1,10,13,14,17,20,21,25,37,32,33,38]
l=[y代表x,y在zip中(pt,t),如果x在[1,3]]
打印([l[i:i+2][1]-l[i:i+2][0]表示范围(0,len(l),2)]内的i)
[13,20,6]
使用
更多\u itertools.chunked()

从更多itertools导入分块
打印([y-x代表x,y分块([y代表x,y在zip(pt,t)中,如果x在[1,3]],2]))
[13,20,6]
解释

如果你仔细看,我们会看到这个列表多次出现。这是解决方案的中心

[y代表x,y在zip中(pt,t),如果x在[1,3]]
那么,发生了什么事

使用
zip
函数,我们制作成对元素的列表,如果x元素(第一个列表元素对)是1或3,我们将其添加到列表中

这给了我们一个需要找出的差异列表

#|--| |--|----|
[1, 14, 17, 37, 32, 38]
现在是第二部分,从中得到区别。我们基本上需要用这个做对,我这里要用的方法是分块。将列表划分为块的纯python方法如下所示:

#given a list l
chunklen = 2 
[l[i:i+chunklen] for i in range(0, len(l), chunklen)]
使用此选项,我们可以将
[1,14,17,37,32,38]
列表划分为:

[[1, 14], [17, 37], [32, 38]]
但立即得到差异要简单得多

l[i:i+chunklen][1]-l[i:i+chunklen][0]
#given l[i:i+chunklen] as [1, 14] this would return 14-1 i.e. 13
代码:

输出:

[[1, 10, 13, 14], [17, 20, 21, 25, 37], [32, 33, 38]]
[13, 20, 6]

StackOverflow没有为你做功课。@FrankYellin我为这里的误解道歉。谢谢你分享这个链接。我不是一个学生,而是一个(显然没有经验的)Python用户,正在为一个项目使用医学数据集。我对这条信息进行了编辑,使其更加清晰。我在下面进行了澄清,但这个问题是基于一个医学数据集,该数据集是从要求在iPad上绘制图像的患者那里收集的。在不同的时间点(即上面的
t
系列),记录了(x,y)坐标[尽管我没有在这个问题中包括该信息,因为它是不必要的],并记录了一个指示点性质的标签,该标签标识了该人是否刚刚将苹果笔按到页面上(即1),拖动(即2),或者将他们的苹果笔从记录的页面(即3)上取下-这是上面描述的
pt
系列-这非常有用且清晰-感谢您分享使用
more\u itertools
软件包的另一种方法。以前没有太多接触过!没问题,我会补充一些额外的解释!如果我能知道的话,你从哪里得到这个问题的?当然!很高兴提供一些背景。我目前正在处理一个工作中的医学数据集,该数据集是从要求在iPad上绘制图像的患者那里收集的。在不同的时间点(即
t
),记录了(x,y)坐标[尽管我没有在这个问题中包括该信息,因为它是不必要的],并记录了一个指示该点性质的标签,该标签标识该人是否刚刚将苹果笔按到页面上(即1),是否拖动(即2),或者把他们的苹果笔从记录的页面上拿开(即3),这就是上面描述的
pt
系列哦,听起来很有趣!很高兴为您提供帮助:)非常感谢您刚才添加的深入解释-从中学到了很多!
[[1, 10, 13, 14], [17, 20, 21, 25, 37], [32, 33, 38]]
[13, 20, 6]