如何计算 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]
即可。
我有以下字典,键是元组:
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]
即可。