繁体   English   中英

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

[英]Python: Difference between two positions in one list depending on rule set for another list

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

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

例如,输入可能如下所示:

#    |--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]

使用纯python

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]

l = [y for x, y in zip(pt,t) if x in [1,3]]

print([l[i:i+2][1] - l[i:i+2][0] for i in range(0, len(l), 2)])
[13, 20, 6]

使用more_itertools.chunked()

from more_itertools import chunked

print([y-x for x,y in chunked([y for x, y in zip(pt,t) if x in [1,3]], 2)])
[13, 20, 6]

解释

如果您仔细观察,我们会看到多次出现此列表推导式。 这是解决方案的中心!

[y for x, y in zip(pt,t) if x in [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

这似乎有效

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]

代码:

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] 

events_t =[]
arr = []
for pt_ele, t_ele in zip(pt, t):
    arr.append(t_ele)
    if pt_ele == 3:
        events_t.append(arr)
        arr = []
print(events_t)
res = [i[-1] - i[0] for i in events_t]
print(res)

输出:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM