Inside fixtures.txt是下赛季英超联赛的内容。数据如下所示:
foo@ubuntu:~/Desktop$ less fixtures.txt |head -n 4
8 August 2015
AFC Bournemouth v Aston Villa #BOUAVL
Arsenal v West Ham United #ARSWHU
Chelsea v Swansea City #CHESWA
我想为每支球队排名。我的方法看起来非常糟糕,包括一堆行。什么是更有效的方法呢?
teams = {'BOU' : 4, 'WAT' : 4, 'LEI' : 4, 'NOR' : 4, 'AVL' : 3, 'SUN' : 3, 'NEW' : 3, 'WBA' : 3, 'STK' : 2, 'SWA' : 2, 'EVE': 2, 'SOU' : 2, 'CPL' : 2, 'TOT': 2, 'ARS' : 1, 'CHE' : 1, 'MUN' : 1, 'LIV' : 1, 'MCI' : 1}
fd = open("fixtures.txt", "r")
for lines in fd:
lines = lines.strip()
matches = lines.split("#")
if "CHE" in lines:
for k,v in teams.items():
if k in matches[1]:
if "CHE" not in k:
print k,v
输出(切尔西的第一场比赛):
SWA 2
MCI 1
WBA 3
EVE 2
ARS 1
NEW 3
SOU 2
...
答案 0 :(得分:2)
什么是最好的取决于您需要处理多少数据。在这种情况下,问题的一半是数据检索和打印都混乱了。除非您正在处理大量数据,否则建议将它们拆分。
如果数据量很小(少于几百个匹配),您可以将所有数据读入列表,如下所示:
teams = {'BOU' : 4, 'WAT' : 4, 'LEI' : 4, 'NOR' : 4, 'AVL' : 3, 'SUN' : 3, 'NEW' : 3, 'WBA' : 3, 'STK' : 2, 'SWA' : 2, 'EVE': 2, 'SOU' : 2, 'CPL' : 2, 'TOT': 2, 'ARS' : 1, 'CHE' : 1, 'MUN' : 1, 'LIV' : 1, 'MCI' : 1}
def read_fix(filename):
"""Reads a named fixtures-file and returns a list containing pairs of team names [["BOU","AVL"],["ARS","WHU"],...]"""
matches=[] #create an empty list, this is part of a so called accumulator pattern
with open(filename, "r") as fd: #The with statement guarantees that the opened file is closed when the block ends.
for line in fd:
line = line.strip().split("#") #You can chain multiple method-calls on one line, this does both white-space-stripping and splitting on #.
if len(line)==2: #Filter out only lines that contain a game (or well exactly one #, possibly dangerous)
teams=line[1] #Remember that python indexes lists and strings from 0
matches.append([teams[0:3],teams[3:6]]) #split the part after the # into two parts, 3 letters each and add the pair to the list (this is the accumulation step of the accumulator-pattern)
return matches
然后使用其他功能进行打印:
def print_fix(games,team):
"""Takes a list of games (as team-pairs) and prints information for the opposing team in each match that contains the specified team."""
team=team.upper() #just for convenience
for game in games:
if team in game: #The in statement returns True if the team element is equal to at least one of the teams in the game-array.
#For example: team in ["CHE","LIE"] would return true if team was either "CHE" or "LIE"
if game[0] == team: #If "my team" is the first one of the pair, then the "Other team" must be the second, and the other way around.
other=game[1]
else:
other=game[0]
print other, teams[other]
matches= read_fix("fixtures.txt")
print_fix(matches,"CHE")
一种更有效的方法是使用dict进行临时存储,但我认为这段代码可能稍微容易阅读。