Python 检查连续的相似值并更换
我有一个索引值列表,如[1,1,2,2,2,3,3,4,4,4,5,5],另一个列表包含每个索引的特征值,如[3,14,6,13,15,3,7,18,4,12,17,2,9]。对于相同序列的第一个索引(例如[2,2,2]中的前2个),特征值总是最小的(例如,这里是6),并且随着相似索引的数量增加而增加(例如,对于索引2,它朝15增加) 我希望Python查找类似的索引(索引序列),然后更改它们的特征值,以便每个索引获得最小特征值(例如,[2,2,2]将具有[6,6,6],而不是[6,13,15]) 我怎么做?(或者,如果有的话,你可以给我指一下工具)Python 检查连续的相似值并更换,python,python-3.x,Python,Python 3.x,我有一个索引值列表,如[1,1,2,2,2,3,3,4,4,4,5,5],另一个列表包含每个索引的特征值,如[3,14,6,13,15,3,7,18,4,12,17,2,9]。对于相同序列的第一个索引(例如[2,2,2]中的前2个),特征值总是最小的(例如,这里是6),并且随着相似索引的数量增加而增加(例如,对于索引2,它朝15增加) 我希望Python查找类似的索引(索引序列),然后更改它们的特征值,以便每个索引获得最小特征值(例如,[2,2,2]将具有[6,6,6],而不是[6,13,15]
(最后一句话不那么重要)
此外,我需要最小特征值为10,我想通过从上一个索引序列中获取最小特征值来替换它们。尝试一下此代码:
from itertools import groupby
from operator import itemgetter
indices = [1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5]
values = [3, 14, 6, 13, 15, 3, 7, 18, 4, 12, 17, 2, 9]
pairs = zip(indices, values)
sequences = [[v for (i, v) in group] for (_, group) in groupby(pairs, itemgetter(0))]
min_char_vals = [min(seq) for seq in sequences for _ in seq]
请注意,在您的示例中,列表索引
和值
的长度不同。我在索引中插入了一个额外的3
项来解决此问题
以下交互式会话演示了上述代码段的工作原理:
In [232]: pairs
Out[232]:
[(1, 3),
(1, 14),
(2, 6),
(2, 13),
(2, 15),
(3, 3),
(3, 7),
(3, 18),
(4, 4),
(4, 12),
(4, 17),
(5, 2),
(5, 9)]
In [233]: sequences
Out[233]: [[3, 14], [6, 13, 15], [3, 7, 18], [4, 12, 17], [2, 9]]
In [234]: min_char_vals
Out[234]: [3, 3, 6, 6, 6, 3, 3, 3, 4, 4, 4, 2, 2]
至于问题的第二部分,为了将min\u char\u vals
的元素保持在阈值以下,您需要对min\u char\u vals
进行一些就地后处理:
for i, mcv in enumerate(min_char_vals):
if mcv >= 10:
min_char_vals[i] = 0 if i == 0 else min_char_vals[i-1]
当min\u char\u vals
的第一个元素的值大于或等于10
时,条件表达式旨在为该元素指定一个默认的最小特征值(我在代码中使用了0
)
如果将初始化更改为:
values = [3, 14, 6, 13, 15, 13, 17, 18, 4, 12, 17, 2, 9]
然后执行所述的后处理,得到的结果如下:
In [280]: min_char_vals
Out[280]: [3, 3, 6, 6, 6, 6, 6, 6, 4, 4, 4, 2, 2]
指示工具并非如此。如果您提供