我有一个索引值列表,如[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。如果在索引序列中所有特征值都是> 10,我想通过从前一个索引序列中取最小特征值来替换它们。
答案 0 :(得分:1)
试试这段代码:
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]
请注意,在您的示例中,列表indices
和values
具有不同的长度。我已在3
中插入了另一个indices
项来解决此问题。
以下交互式会话演示了上述代码段的工作原理:
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_char_vals
的元素低于阈值,您需要在min_char_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]
条件表达式的目的是在0
的值大于或等于min_char_vals
时,将默认的最小特征值(我在代码中使用10
)分配给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]
并执行所描述的后期处理,这就是你得到的:
{
"de": {
"errors.de.i18n.js": {
"errors": {
"addcreditcard": "Wir konnten diese Karte nicht verifizieren. Bitte überprüfe deine Angaben und versuche es noch einmal."
}
}
}
}