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
是数字1,2,3的序列列表,其中1后面是连续的2字符串,然后是3。pt
- 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]