我对Python和整体编程都很陌生,所以请耐心等待。
我所拥有的是['Male', 'Female', 'Eunuch']
字典作为值和不同的名称作为键:
Persons = { 'Hodor' : 'Male', 'Tyrion': 'Male', 'Theon': 'Male', 'Arya': 'Female', 'Daenerys': 'Female', 'Sansa': 'Female', 'Varys': 'Eunuch}
我想将它们订购到{ Gender: {Names: Counts}}
因此:
输入:
lst = ['Hodor', 'Hodor', 'Tyrion', 'Tyrion', 'Tyrion', 'Arya', 'Daenerys', 'Daenerys', 'Varys']
输出:
{'Male': {'Hodor': 2, 'Tyrion': 3, Theon: 0}, 'Female': {'Arya': 1, 'Daenerys': 2, 'Sansa': 0}, 'Eunuch': {'Varys': 1}}
我尝试的第一件事是制作一个计算代码:
counts = {}
for key in Persons:
counts[key] = 0
for key in lst:
counts[key] += 1
我的字典D现在包含计数,但我如何一起计算它们呢?
Names = Persons.keys()
Gender = Persons.values()
Counts = counts.values()
Names = counts.keys()
如果没有提到varys,性别'Eunuch'不应该在输出中。 我尝试了不同的东西,但是当我尝试连接它们时。我尝试使用值切换键,但只出现一个名称。
希望它能理解我想做的事情:)
编辑:如果Sansa没有被提及而其他女性是她的价值应该是0.我希望能够操纵这些数字。比如Hodor提到的与所有男性相比的百分比。
答案 0 :(得分:3)
考虑
from collections import Counter
cnt = Counter(lst)
print {gender: {name: cnt[name] for name in persons if persons[name] == gender}
for gender in set(persons.values())}
# {'Eunuch': {'Varys': 1},
# 'Male': {'Tyrion': 3, 'Hodor': 2, 'Theon': 0},
# 'Female': {'Daenerys': 2, 'Arya': 1, 'Sansa': 0}}
要计算百分比,让我们添加辅助函数:
def percentage_dict(d):
s = float(sum(d.values()))
return {k: 100 * v / s for k, v in d.items()}
然后
print {gender: percentage_dict({name: cnt[name] for name in persons if persons[name] == gender})
for gender in set(persons.values())}
# {'Eunuch': {'Varys': 100.0}, 'Male': {'Hodor': 40.0, 'Theon': 0.0, 'Tyrion': 60.0}, 'Female': {'Daenerys': 66.66666666666667, 'Arya': 33.333333333333336, 'Sansa': 0.0}}
这就是如何使用辅助函数更有效地编写这种理解:
def invert(d):
"""Turn {a:x, b:x} into {x:[a,b]}"""
r = {}
for k, v in d.items():
r.setdefault(v, []).append(k)
return r
然后
cnt = Counter(lst)
print {gender: {name: cnt[name] for name in names}
for gender, names in invert(persons).items()}
排除总和为零的子条款
print {gender: {name: cnt[name] for name in names}
for gender, names in invert(persons).items()
if any(cnt[name] for name in names)
}
答案 1 :(得分:1)
from collections import defaultdict
gender = {
'Hodor' : 'Male',
'Tyrion': 'Male',
'Theon': 'Male',
'Arya': 'Female',
'Daenerys': 'Female',
'Sansa': 'Female',
'Varys': 'Eunuch'
}
lst = ['Hodor', 'Hodor', 'Tyrion', 'Tyrion', 'Tyrion', 'Arya', 'Daenerys', 'Daenerys', 'Varys']
result = defaultdict(lambda: defaultdict(int))
for name in lst:
result[gender[name]][name] += 1