2013-02-07 64 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