2013-02-07 35 views
-1

所有重复的值,我有一个像改变Python列表

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

Python的list什么的,说的有效途径,通过-1 all其中值a发生一次以上的valuebs倍增。

例如:

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

谢谢!

+0

没有,这是一个编程实现,必须建立在你的一部分做对在列表中的项目和它的键和值等下次你的相关字典** **的项目,它的键和值在..这只是一个混乱开始与国际海事组织。 – Torxed

+0

你最好的选择是检查'** key2''是否存在于**列表**中的其他**字典**之一中,如果是,则增加1或者我不知道。 – Torxed

+0

你有误读了这个问题......我正在寻找比通过列表两次解决方案的天真循环更好的东西。 – algorithmicCoder

回答

0

这应该是诀窍,尽管它通过两次列表。首先,列出所有的key1s。然后,对于列表中的每个字典,检查其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 
+0

你确定这不会乘以-1 ** numofoccurences而不是-1? – algorithmicCoder

+0

啊,它当然应该改变key2的值,而不是key1,编辑。但否则它可以正常工作。因为列表中的每个字典都被访问过一次。 – Junuxx

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
from collections import Counter 
valueAs = Counter([x["key1"] for x in myList]) 

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

你刚刚从我的回答中复制了这个吗? – Junuxx

+0

@Junuxx你的答案是越野车,你甚至没有测试过,我固定它,因为我在同一条线上思考,然后你复制我的答案。 – gaurav

+0

是的,有几个拼写错误,你可以指出它们。在你自己的工作中修复一个明显的错字不是复制。 – Junuxx