【问题标题】:Create dictionary with count of values from list使用列表中的值计数创建字典
【发布时间】:2019-11-24 18:26:58
【问题描述】:

我试图弄清楚如何根据列表中的每个项目创建一个字典,其中学校的键为学校并评估胜负平局。例如,调用 my_dict['Clemson'] 将返回字符串“1-1-1” "

team_score_list =[['Georgia', 'draw'], ['Duke', 'loss'], ['Virginia Tech', 'win'], ['Virginia', 'loss'], ['Clemson', 'loss'], ['Clemson', 'win'], ['Clemson', 'draw']]

上述列表的输出应该是以下字典:

{'Georgia': 0-0-1, 'Duke': 0-1-0, 'Virginia Tech': 1-0-0, 'Virginia': 0-1-0, 'Clemson': 1-1-1}

就上下文而言,原始数据来自 CSV,其中每一行的格式为日期、对手、位置、得分为、反对得分。

例如:2016-12-31,Kentucky,Neutral,33,18。

我已经设法将数据整理到上面的列表中(尽管可能不是以最有效的方式),但只是不确定如何将其转换为上面的格式。

任何帮助将不胜感激!

【问题讨论】:

  • 你能解释一下你的输出吗? Georgia 如何映射到 0-0-1Duke0-1-0clemson 呢?逻辑是什么?
  • 感谢您的回复,如果我没有说得更清楚,对不起。第一个值应该是获胜的次数,第二个应该是失败的次数,第三个应该是平局的次数。所以对于上面的列表,Georgia 只出现了一次,其值为“draw”。所以字典键应该是学校名称(Georgia),取值为0-0-1,表示0胜0负1平。另一方面,杜克再次只出现一次,但相关的值是损失,因此它被编码为 0-1-0,例如0胜1负0平。克莱姆森出现3次,1胜1平1负,因此1-1-1
  • 您还没有解释如何获得值“0-0-1”。为什么是 0-0-1 而不是 1-0-0??
  • 抱歉,您回复时正在编辑;)

标签: python-3.x


【解决方案1】:

不漂亮,但这应该可以。

team_score_list = [
    ["Georgia", "draw"],
    ["Duke", "loss"],
    ["Virginia Tech", "win"],
    ["Virginia", "loss"],
    ["Clemson", "loss"],
    ["Clemson", "win"],
    ["Clemson", "draw"],
]


def gen_dict_lst(team_score_list):
    """Generates dict of list based on team record"""
    team_score_dict = {}
    for team_record in team_score_list:
        if team_record[0] not in team_score_dict.keys():
            team_score_dict[team_record[0]] = [0, 0, 0]
        if team_record[1] == "win":
            team_score_dict[team_record[0]][0] += 1
        elif team_record[1] == "loss":
            team_score_dict[team_record[0]][1] += 1
        elif team_record[1] == "draw":
            team_score_dict[team_record[0]][2] += 1
    return team_score_dict


def convert_format(score_dict):
    """formats list to string for output validation"""
    output_dict = {}
    for key, value in score_dict.items():
        new_val = []
        for index, x in enumerate(value):
            if index == 2:
                new_val.append(str(x))
            else:
                new_val.append(str(x) + "-")
        new_str = "".join(new_val)
        output_dict[key] = new_str
    return output_dict


score_dict = gen_dict_lst(team_score_list)
out_dict = convert_format(score_dict)
print(out_dict)

【讨论】:

  • 你先生,是冠军。非常感谢你做的这些!能够看到如何做到这一点非常有帮助。非常感谢:)
【解决方案2】:

您可以先制作一个字典,然后在迭代字典值时插入/增加获胜、失败和平局的值。在这里,我展示了一种使用与用于赢、输和平局的字符串相同的变量名称的方法,然后使用 global()['str'] (from another answer) 增加字典中的相应值

dct={}
for i in team_score_list:
draw=2
win=0
loss=1
if i[0] in dct:
    dct[i[0]][globals()[i[1]]]+=1
else:
    dct[i[0]]=[0,0,0]
    dct[i[0]][globals()[i[1]]]=1

然后,您可以使用 '-'.join(...) 将列表转换为字符串,从而以字典中所需的格式获取它。

【讨论】:

    【解决方案3】:

    我现在明白你的意思了:

    你可以的

    a = dict()
    f = lambda x,s: str(int(m[x]=='1' or j==s))
    for (i,j) in team_score_list: 
        m = a.get(i,'0-0-0')
        a[i] = f"{f(0,'win')}-{f(2,'draw')}-{f(4,'loss')}"
    
    {'Georgia': '0-1-0',
     'Duke': '0-0-1',
     'Virginia Tech': '1-0-0',
     'Virginia': '0-0-1',
     'Clemson': '1-1-1'}
    

    现在这只是这个例子的答案。如果您有很多数据,最好使用列表然后在最后加入。例如

    b = dict()
    g = lambda x,s: str(int(m[x]) + (j==s))
    for (i,j) in team_score_list: 
        m = b.get(i,[0,0,0])
        b[i] =[g(0,"win"),g(1,"draw"),g(2,"loss")]
    
    {key:'-'.join(val) for key,val in b.items()}
    {'Georgia': '0-1-0',
     'Duke': '0-0-1',
     'Virginia Tech': '1-0-0',
     'Virginia': '0-0-1',
     'Clemson': '1-1-1'}
    

    【讨论】:

    • 也感谢您的回复:)这非常有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 2020-07-30
    • 2021-08-18
    • 2018-11-06
    相关资源
    最近更新 更多