Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 迭代时向int的defaultdict添加键_Python_Csv_Dictionary_Defaultdict - Fatal编程技术网

Python 迭代时向int的defaultdict添加键

Python 迭代时向int的defaultdict添加键,python,csv,dictionary,defaultdict,Python,Csv,Dictionary,Defaultdict,该脚本需要从文本/csv文件读取输入,但一旦我尝试实现该功能,一切都会中断 这是我的密码: from collections import defaultdict #from csv import reader data = """Lions 3, Snakes 3 Tarantulas 1, FC Awesome 0 Lions 1, FC Awesome 1 Tarantulas 3, Snakes 1 Lions 4, Grouches 0""" # with open('sample

该脚本需要从文本/csv文件读取输入,但一旦我尝试实现该功能,一切都会中断

这是我的密码:

from collections import defaultdict
#from csv import reader

data = """Lions 3, Snakes 3
Tarantulas 1, FC Awesome 0
Lions 1, FC Awesome 1
Tarantulas 3, Snakes 1
Lions 4, Grouches 0"""

# with open('sample_input.csv') as data:
#     csv = reader(data)
#     list_csv = [line.rstrip('\n') for line in data]

data_list = data.splitlines()


def splitter(row):
    left_team, right_team = row.split(',')
    return {
        'left': left_team[:-2].strip(),
        'left_score': int(left_team[-2:].strip()),
        'right': right_team[:-2].strip(),
        'right_score': int(right_team[-2:].strip())
    }


data_dicts = [splitter(row) for row in data_list]


team_scores = defaultdict(int)
for game in data_dicts:
    if game['left_score'] == game['right_score']:
        team_scores[game['left']] += 1
        team_scores[game['right']] += 1
    elif game ['left_score'] > game['right_score']:
        team_scores[game['left']] += 3
    else:
        team_scores[game['right']] += 3
    print(team_scores)

teams_sorted = sorted(team_scores.items(), key=lambda team: team[1], reverse=True)


# for line in teams_sorted:
#     print(line)
此外,我需要的预期输出是:

1. Tarantulas, 6 pts
2. Lions, 5 pts
3. FC Awesome, 1 pt
3. Snakes, 1 pt
4. Grouches, 0 pts
我只是不知道该怎么走到这一步。我用print语句检查了大部分代码,字典似乎工作正常,但没有打印最后一个团队及其分数(Grouches,0分)

我目前得到以下输出:

('Tarantulas', 6)
('Lions', 5)
('Snakes', 1)
('FC Awesome', 1)

任何帮助都将不胜感激

您尝试过CSV python库吗?从文档()中提取:


干得好,走了这么远。您已经成功地实现了逻辑,但是遇到了
defaultdict
的特定行为。有两个要点需要注意:

  • 如果未使用
    defaultdict
    初始化密钥,则不会将其添加到字典中。您只需将0添加到未初始化的密钥即可完成此操作
  • 对于所需的特定格式,您可以在排序后在循环中使用
    enumerate
  • 把这些放在一起,修改循环如下:

    for game in data_dicts:
        if game['left_score'] == game['right_score']:
            team_scores[game['left']] += 1
            team_scores[game['right']] += 1
        elif game ['left_score'] > game['right_score']:
            team_scores[game['left']] += 3
            team_scores[game['right']] += 0
        else:
            team_scores[game['left']] += 0
            team_scores[game['right']] += 3
    
    然后在循环中使用
    枚举
    。您可以使用
    operator.itemgetter
    和f-strings(Python 3.6+中的后者)使逻辑更清晰:

    from operator import itemgetter
    
    teams_sorted = sorted(team_scores.items(), key=itemgetter(1), reverse=True)
    
    for idx, (team, score) in enumerate(teams_sorted, 1):
        print(f'{idx}. {team} {score} pts')
    
    1. Tarantulas 6 pts
    2. Lions 5 pts
    3. Snakes 1 pts
    4. FC Awesome 1 pts
    5. Grouches 0 pts
    

    添加CSV时的代码中断。CSV阅读器为您执行
    拆分(',')
    。所以您的
    左团队=行[0]
    右团队=行[1]

    因此,您的代码更改为

    def spliter(row):
        left_team, right_team = row
        return {
            'left': left_team[:-2].strip(),
            'left_score': int(left_team[-2:].strip()),
            'right': right_team[:-2].strip(),
            'right_score': int(right_team[-2:].strip())
        }
    
    with open('data.csv') as data_obj:
        reader = csv.reader(data_obj)
        data_dicts = [splitter(row) for row in reader]
    
    如果要手动拆分(',')
    ,可以进行纯文本读取


    请解释“一切都中断了”对不起,我的意思是,当我实现csv阅读器时,我得到了错误“AttributeError:”\u io.TextIOWrapper“对象没有属性”“splitlines”“”。您是否尝试过使用pandas包来读取csv或txt文件?我尝试过使用pandas,但对我来说非常混乱。有没有一种方法可以只导入带有pandas的文件而不在代码中做太多更改?
    splitlines
    是一个字符串函数。不能将其应用于文件对象<代码>阅读器
    提供逗号分隔的行。所以您不需要
    row.split(',')
    。如果你想使用csv,你应该稍微改变一下你的逻辑。如果出于某种原因不想更改代码,可以使用纯文本读取,例如
    data\u list=data.readlines()
    是的,但是splitlines函数不起作用。
    def spliter(row):
        left_team, right_team = row
        return {
            'left': left_team[:-2].strip(),
            'left_score': int(left_team[-2:].strip()),
            'right': right_team[:-2].strip(),
            'right_score': int(right_team[-2:].strip())
        }
    
    with open('data.csv') as data_obj:
        reader = csv.reader(data_obj)
        data_dicts = [splitter(row) for row in reader]
    
    with open('data.csv') as data_obj:
        data_list = [line.rstrip('\n') for line in data_obj.readlines()]