-1

我在 python 中有一个列表,比如

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

例如,将 valuea 出现多次的所有 valueb 乘以 -1 的有效方法是什么。

例如:

[{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/ 更好算法的东西,而不仅仅是循环遍历列表两次。

谢谢!

4

3 回答 3

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

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

于 2013-02-07T11:22:55.657 回答
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

您可以通过用户 aCounter而不是列表的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
于 2013-02-07T11:19:06.087 回答
-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
于 2013-02-07T11:29:29.340 回答