[英]Inserting elements of one list into another list at different positions in python
[英]Python: Difference between two positions in one list depending on rule set for another list
考虑两个长度相同的列表:
t
是以秒为单位的不规则时间间隔列表,按时间顺序排列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]
使用纯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.