簡體   English   中英

如何計算包含列表的字典中每個鍵的每個唯一值?

[英]How do I count each unique value for each key in a dictionary containing lists?

我有以下字典:

dict = {'A': [1,1,2], 'B': [1,1,1], 'C': [2,2,2,1,2]}

我希望輸出告訴我每個鍵有多少個值,例如:

if value == 1  -> A, 2; B,3; C,1
if value == 2   -> A, 1; B,0; C,4

到目前為止,我有:

for i in dict[i]:
    if i == 1:
        participants_luck += 1
    elif i == 2:
        participants_skill += 1
    

這是一個靈活的解決方案,用於計算字典每個不同值的出現次數

dict = {"A": [1,1,2], "B": [1,1,1], "C": [2,2,2,1,2]}
different_values = set()

for values in dict.values():
    for el in values:
        different_values.add(el)

for possible_value in different_values:
    print(possible_value)
    for key, values in dict.items():
        print(key, sum(value == possible_value for value in values))
    print("\n")

輸出:

1
A 2
B 3
C 1


2
A 1
B 0
C 4

更新:如果您還想處理 dict 中的非列表項,您可以這樣做:

from collections.abc import Iterable

dict = {"A": [1,1,2], "B": [1,1,1], "C": [2,2,2,1,2], "D": 1}
different_values = set()

for values in dict.values():
    if isinstance(values, Iterable):
        for el in values:
                different_values.add(el)
    else:
        different_values.add(values)


for possible_value in different_values:
    print(possible_value)
    for key, values in dict.items():
        if isinstance(values, Iterable):
            print(key, sum(value == possible_value for value in values))
        else:
            print(key, int(values == possible_value))
    print("\n")

輸出將是:

1
A 2
B 3
C 1
D 1


2
A 1
B 0
C 4
D 0

定義一個函數,以便您可以在需要時搜索不同的值。 使用count方法讓事情變得非常容易。

d = {'A': [1,1,2], 'B': [1,1,1], 'C': [2,2,2,1,2]}

def foo(value, dictionary):
    for key,l in dictionary.items():
        print(f"{key} : {l.count(value)}")

foo(1,d)
foo(2,d)

制作一個功能來做到這一點會很有趣。

def count_stuff(any_dict, wanted_val):
    counted_dict = {}
    for key in any_dict.keys():
        count = 0
        for element in any_dict[key]:
            count += (element == wanted_val)
        counted_dict[key] = count
    
    return counted_dict

運行你的例子...

your_dict = {"A": [1,1,2], "B": [1,1,1], "C": [2,2,2,1,2]}
for i in [1, 2]:
    print(i, count_stuff(your_dict, i))

印刷

1 {'A': 2, 'B': 3, 'C': 1}
2 {'A': 1, 'B': 0, 'C': 4}

這是單線! 你可以寫一個字典理解。 我們有一個字典mydict和一個要計數的value 我們首先迭代字典中的項目。 對於字典中的每個列表,我們遍歷該列表,並找到i == value的總和。 因為True計數為1, False計數為0, sum(i == value for i in lst)將得到的數ilst其是等於value 或者,您可以執行lst.count(value) sum(...)技術在您想計算==以外的條件時很有用,例如,如果您想計算有多少元素小於給定值。

def count(mydict, value):
    return {k: sum(i == value for i in lst) for k, lst in mydict.items()}
    # Or, 
    # return {k: lst.count(value) for k, lst in mydict.items()}

d = {'A': [1,1,2], 'B': [1,1,1], 'C': [2,2,2,1,2]}
count(d, 1) # out: {'A': 2, 'B': 3, 'C': 1}
count(d, 2) # out: {'A': 1, 'B': 0, 'C': 4}

然后,您可以像這樣訪問計數:

result = count(d, 1)
print(f"A: {result['A']}, B: {result['B']}, C: {result['C']}")

或者,如果您不想對result的鍵進行硬編碼:

result = count(d, 1)
for k, v in result.items():
    print(f"{k}: {v}")

您可以使用計數器:

from collections import Counter
cnts={k: Counter(v) for k,v in di.items()}

# {'A': Counter({1: 2, 2: 1}), 'B': Counter({1: 3}), 'C': Counter({2: 4, 1: 1})}

然后只需使用理解來根據需要獲取子計數:

>>> {k:v[1] for k,v in cnts.items()}
{'A': 2, 'B': 3, 'C': 1}
>>> ({k:v[2] for k,v in cnts.items()}
{'A': 1, 'B': 0, 'C': 4}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM