我在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算法中的内容,而不仅仅是遍历列表两次。
谢谢!
答案 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