2012-11-29 107 views
1

我需要幫助如何刪除字典的元組中的重複項目。如何刪除字典的多個元組中的重複項?

dict of {tuple of (str, str, str, str): int}) -> tuple of (str, None) 

這裏是字典:

{('ALPHA', 'BETA', 'GAMMA', 'DELTA'): 5 
    ('BETA', 'GAMMA', 'ALPHA', 'DELTA'): 3 
    ('DELTA', 'BETA', 'GAMMA', 'ALPHA'): 1 
    ('GAMMA', 'DELTA', 'ALPHA', 'BETA'): 3 
    ('BETA', 'ALPHA', 'DELTA', 'GAMMA'): 4} 

和整數是tuple這樣的第一指標,我通過得它們分組的值:

def rad_type(particle): 

    my_dict = {} 

    for (k, v) in particle.items(): 
     if (k[0] in my_dict): 
      my_dict[k[0]] += v 
     else: 
      my_dict[k[0]] = v 

    return my_dict 

該返回:

{'ALPHA': 5, 'BETA': 7, 'GAMMA': 3, 'DELTA': 1} 

由於'DELTA'具有在這種情況下爲1的最小值,但我想刪除這樣的元件:

{('ALPHA', 'BETA', 'GAMMA'): 5 
    ('BETA', 'GAMMA', 'ALPHA'): 7 
    ('BETA', 'GAMMA', 'ALPHA'): 1 
    ('GAMMA', 'ALPHA', 'BETA'): 3} 

這給出ALPHA = 5, BETA = 8, GAMMA = 3;這是我真正需要的詞典。

我試圖刪除最少的元素,它不工作?

for (p, v) in my_dict.items(): 
     if (max(my_dict.values())/sum(my_dict.values()): 
      if (v == min(my_dict.values())): 
       del my_dict[p] 
     return my_dict 

但是這給ALPHA = 5, BETA = 7, GAMMA = 3

由於這回一本字典,我怎麼刪除重複的一個tuple,然後返回作爲無字典進口什麼?

該問題類似於this

+0

的「回報」,在你的膏語句misindented:他們是裏面的「for」循環。 –

+0

我的錯誤,複製並粘貼我的代碼時出現縮進錯字 – TheStruggler

+0

您的第二個代碼塊無法運行,並且如果我修復了語法錯誤,則不會提供您說的答案。它也不清楚你如何得到每組結果,例如你爲什麼期望'BETA = 8'?字典中的值是否在變化?它們如何變化?請發佈我們可以運行的完整工作示例以及預期輸出。 – aquavitae

回答

1

這裏是一個建議..
如果我們使用功能:

def rad_type(particle): 

    my_dict = {} 

    for (k, v) in particle.items(): 
     if (k[0] in my_dict): 
      my_dict[k[0]] += v 
     else: 
      my_dict[k[0]] = v 

    return my_dict 

,如果我們定義一個使用你的函數另一個功能:

def filter(dict): 
     filter1 = rad_type(dict) 
     i = 0 
     for k ,val in dict.items(): 
       dict[k] = filter1[k[0]] 
       i +=1 
     mini_key = [k for k , val in filter1.items() if val == min([value for key , value in filter1.items()])][0] 
     filter2 = {tuple(y for y in key if y != mini_key):value for key, value in dict.items()} 
     filter3 = rad_type(filter2) 
     return filter3 

,如果我們將此功能上字典粒子:

result = filter(particle) 

輸出爲:

{'ALPHA': 5, 'BETA': 8, 'GAMMA': 3} 
+0

有沒有辦法不使用'過濾'? – TheStruggler

+0

這裏的過濾器只是一個名字,你可以用任何其他名稱替換它(例如helper),你可以嘗試複製代碼,然後用helper替換每個過濾器,它會給出相同的輸出 – mazlor

0

你是需要 a Counter某種。我已經使用Collections.Counter實現了一個解決方案,但是如果您不能直接導入Counter,則必須自己實施。或者,Collections.Counter是純Python,您可以將Counter的源代碼複製到您自己的解決方案中,以避免導入它。

def display_results(data): 
    ''' Displays the sum of the first entries in a tuple in a given dictionary 

    >>> display_results(data) 
    ... {'ALPHA': 5, 'BETA': 7, 'GAMMA': 3, 'DELTA': 1}''' 

    data = Counter(data) 
    count = Counter() 
    for i in data: 
     count[i[0]] += data[i] 
    return count 

def process_data(data): 
    ''' Generates a new Counter object with the contents of data, minus the least common 
    object in the first tuple as defined by display_results(). 

    >>> data = process_data(data) 
    >>> display_results(data) 
    {'ALPHA' : 5, 'BETA' : 7, 'GAMMA' : 3} ''' 

    data = Counter(data) 
    count = Counter() 
    least_common = display_results(data).most_common()[-1][0] 
    for i in data: 
     j = list(i) 
     j.remove(least_common) 
     count[tuple(j)] += data[i] 
    return count