如果两个人有相同的分数如何返回由“和”连接的两个名称

问题描述 投票:0回答:2

我正在计算二维数组字典中人们的平均分数,我想知道如何返回两个用“和”连接相同分数的人; EX:名称和名称

我的代码:

def bestAverage(inputDict):
    dic = {}
    for i in inputDict:
        if i[0] in dic.keys():
            dic[i[0]].append(int(i[1]))
        else:
            dic[i[0]] = [int(i[1])]
    totle_score = 0
    print(dic)
    for key, value, in dic.items():
        for c in value:
         totle_score += int(c)
        Q = len(value)
        avrage = totle_score / Q
        dic[key]= [avrage]
    print(dic)

我的意见:

inputDict = [ ["Diane", 20],["Bion",25],["Jack","30"],["Diane","50"] ]
result = bestAverage(inputDict)

结果:

{'Diane': [35.0], 'Bion': [95.0], 'Jack': [125.0]}
python
2个回答
0
投票

使用排序字典,您可以获得所需的字典。对不起,我觉得我的代码有点复杂。

dic = {'Diane': [35.0], 
       'Bion': [95.0], 
       'Jack': [125.0], 
       'Diane_2': [35.0], 
       'Bion_2':[95], 
       'Diane_3':[35.0], 
       'John':[10]}

import operator

sorted_dic = sorted(dic.items(), key=operator.itemgetter(0))
new_dic = dict()
preKey = sorted_dic[0][0]
preValue = sorted_dic[0][1]
nms = preKey
for key,value in sorted_dic[1:]:
    if(value == preValue):
        nms  += ' and ' + key
    else:
        new_dic[nms] = preValue
        preKey = key
        preValue = value
        nms = preKey
new_dic[nms] = preValue

print(new_dic)

结果:

{'Jack':[125.0],'John':[10],'Diane and Diane_2 and Diane_3':[35.0],'Bion and Bion_2':[95.0]}


0
投票

根据评论中的OP问题,此示例现在生成一个最终结构,其中仅包含具有相同分数的多个人的分数的条目。

data = {'Diane': [35.0], 'Bion': [95.0], 'Jack': [125.0], 'Sam': [95.0]}

# Here, we create a dict of lists, where the keys are the scores, and the values
# are the names of each person who has that score.  This will produce:
#
# {
#     35.0: ['Diane'],
#     95.0: ['Bion', 'Sam'],
#     125.0: ['Jack']
#  }

collected = {}

# For each key (name) in the input dict...
for name in data:
    # Get the score value out of the array for this name
    val = data[name][0]

    # If we don't have an entry in our new dict for this score (no key in the dict of that
    # score value) then add that entry as the score for the key and an empty array for the value
    if val not in collected:
        collected[val] = []

    # Now that we're sure we have an entry for the score of the name we're processing, add
    # the name to the array for that score in the new dict
    collected[val].append(name)

# Now we just "flip" each entry in the 'collected' map to create a new dict.  We create
# one entry in this dict for each entry in the 'collected' map, where each key is a
# single string where we've combined all of the names with the same score, separated
# by 'and', and each value is the score that those names had.

result = {}

# Now iterate over each of our keys, the unique scores, in our new 'collected' dict...
for val in collected:

    # We only want to create an entry in the new dict if the entry we're processing has more than
    # just one name in the list of names.  So here, we check for that, and skip adding an entry to
    # the new dict if there is only one name in the list
    if len(collected[val]) == 1:
        continue

    # Combine the value of this entry, the list of names with a particular score, into a single string
    combinedNames = " and ".join(collected[val])

    # Add an entry to our 'result' dict with this combined name as the key and the score as the value
    result[combinedNames] = val

# Print each combined name string from the resulting structure
for names in result:
    print(names)

输出:

Bion and Sam
© www.soinside.com 2019 - 2024. All rights reserved.