Python 迭代时向int的defaultdict添加键
该脚本需要从文本/csv文件读取输入,但一旦我尝试实现该功能,一切都会中断 这是我的密码: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
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()]