更改python列表中所有重复项的值

时间:2013-02-07 11:08:03

标签: python algorithm data-structures

我在python中有一个列表,如

[{key1: valuea1, key2:valueb1}, {key1: valuea2, key2: valueb2}, ....{key1: valueaN, key2: valuebN}]

有效的方法是,例如,乘以-1所有值,其中valuea出现不止一次。

例如:

[{key1: 5, key2:8}, {key1: 2, key2: 4}, {key1: 5, key2: 4}]

变为:

[{key1: 5, key2:-8}, {key1: 2, key2: 4}, {key1: 5, key2: -4}]

寻找内置于python / better算法中的内容,而不仅仅是遍历列表两次。

谢谢!

3 个答案:

答案 0 :(得分:3)

由于您正在寻找一次通过算法,它可能是这样的:

def invert_dupes(lst):
    pos = {}
    for n, e in enumerate(lst):
        k = e['key1']
        if k in pos:
            if pos[k] >= 0:
                lst[pos[k]]['key2'] *= -1
                pos[k] = -1
            e['key2'] *= -1
        else:
            pos[k] = n
    return lst

对于每个“关键”值,我们记住它第一次出现的位置,如果它再次出现,则反转该位置和所有后续位置。

答案 1 :(得分:0)

这应该可以解决问题,尽管它确实会通过两次列表。首先,列出所有key1。然后对于列表中的每个字典,检查其key1值是否出现多次。如果是这样,将key2的值乘以-1。

myList = [{"key1": 5, "key2":-8}, {"key1": 2, "key2": 4}, {"key1": 5, "key2": -4}]
valueAs = [x["key1"] for x in myList]

for x in myList:
    if valueAs.count(x["key1"]) > 1:
        x["key2"] *= -1

您可以通过Counter而不是列表的count()来提高大量词典列表的效率。这样,每个值的出现次数仅计算一次。

from collections import Counter
valueAs = Counter([x["key1"] for x in myList])

for x in myList:
    if valueAs[x["key1"]] > 1:
        x["key2"] *= -1

答案 2 :(得分:-1)

from collections import Counter
valueAs = Counter([x["key1"] for x in myList])

for x in myList:
    if valueAs[x["key1"]] > 1:
        x["key2"] *= -1