如何计算 defaultdict (python) 中元组中的唯一键元素?

How to count unique key elements in a tuple in a defaultdict (python)?

我有以下字典,键是元组:

 defaultdict(<class 'float'>, {('abc', 'xyz'): 1.0, ('abc', 'def'):
 3.0, ('abc', 'pqr'): 1.0, ('pqr', 'xyz'): 1.0, ('pqr', 'def'): 1.0})

第一个关键元素和第二个关键元素如何统计, 这样我就可以得到:

defaultdict(<class 'float'>, {'abc': 3.0, 'pqr': 3.0})

defaultdict(<class 'float'>, {'xyz': 2.0, 'def': 2.0, 'pqr': 1.0})

我忽略了原始字典中的值,只是计算唯一键(分别为第一和第二)。

我想执行如下操作,但出现错误“'tuple' 对象没有属性 'items'”:

first_key_list =[j[0][0] for i in dictionary for j in i.items()]
new_dict = collections.defaultdict(float)
for i in first_key_list:
    new_dict[i] += 1

您的方法是正确的。但如果你想数东西,我建议使用 Counter 对象。

from collections import Counter

c1 = Counter(k[0] for k in d.keys())
c2 = Counter(k[1] for k in d.keys())

说实话,d.keys() 在这里是多余的,因为默认情况下迭代是在键上进行的。


c1
Counter({'abc': 3, 'pqr': 2})

c2
Counter({'def': 2, 'pqr': 1, 'xyz': 2})

for i in dictionary for j in i.items() 不起作用,因为外循环产生字典键(元组),并且 items 不适用于 tuples.

无论如何,您似乎忽略了字典的值。只需在密钥的第一部分使用 collections.Counter

d = {('abc', 'xyz'): 1.0, ('abc', 'def'):
 3.0, ('abc', 'pqr'): 1.0, ('pqr', 'xyz'): 1.0, ('pqr', 'def'): 1.0}

import collections

d1 = collections.Counter(k[0] for k in d)

print(d1)

结果:

Counter({'abc': 3, 'pqr': 2})

如果你想要浮点数,我建议你在计算之后转换为浮点数以避免浮点数不准确:

{k:float(v) for k,v in d1.items()}

或一行:

d1 = {k:float(v) for k,v in collections.Counter(k[0] for k in d).items()}

将键保存为元组:

d1 = {(k,):float(v) for k,v in collections.Counter(k[0] for k in d).items()}

对于第二部分,只需使用 k[1] 即可。