检查连续的相似值和替换

时间:2016-06-22 12:43:59

标签: 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。如果在索引序列中所有特征值都是> 10,我想通过从前一个索引序列中取最小特征值来替换它们。

1 个答案:

答案 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]

请注意,在您的示例中,列表indicesvalues具有不同的长度。我已在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."
            }
        }
    }
}