用字典中的键反转多个值

2024-10-01 09:23:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我对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()

如果没有提到瓦里斯的性别'太监'不应该出现在输出。 我试过不同的方法,但是当我试着把它们联系起来的时候。我尝试用值切换键,但结果只有一个名称出现。在

希望它能理解我想做的事情:)

编辑:如果Sansa没有提到,而其他女性是她的值应该是0。我希望能够操纵数字。说说霍多尔和所有男性的比例。在


Tags: key名称字典namesmalefemalecountspersons
2条回答

考虑

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}}

要计算百分比,让我们添加一个helper函数:

^{pr2}$

然后呢

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}}

下面是如何使用helper函数更有效地编写此理解:

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)
}
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

相关问题 更多 >