0

(隣接する列に)3つのデータを含む名前のCSVファイルを、隣接するデータを引数として取る作成済みクラスの変数に変換するにはどうすればよいですか?

以下のコードはオブジェクトを作成しているように見えますが、リストはオブジェクトの場所であり、私が好む名前ではありません。

誰か助けてもらえますか?

class Teams(object):
  def __init__(self, TeamName, FT, FG, Three):
    self.TeamName = TeamName
    self.FT = FT
    self.FG = FG
    self.Three = Three

North_Carolina = Teams("North Carolina", .643,.458,.371)

print North_Carolina.TeamName, North_Carolina.FT, North_Carolina.FG,North_Carolina.Three
## works fine but manually typed data

def getData(fname):  ##fname is a csv file with 4 columns and 348 rows. One header row.
    Data = open(fname, 'r')
    TeamList = []
    #print Data.read() ## prints a list with comma separated values and line return
    for line in Data:
      info = line.split(",") ##info is a list of lists of Data with Team,FT,FG,3P
      name = info[0]
      FT = info[1]
      FG = info[2]
      Three = info[3]
      newTeam = (name, FT, FG, Three)
      newTeam2 = Teams(newTeam[0],newTeam[1],newTeam[2],newTeam[3]) ##newTeam2 is an object. 
      TeamList.append(newTeam2)
    print TeamList[1].TeamName ##prints North Carolina list[0] print header
    print TeamList #prints list of object locations but not objects themselves

getData("Stats 01-04-2013.csv")

最初printのステートメントは次のように出力します。

North Carolina

2番目printのステートメントは次のように出力します。

[<__main__.Teams object at 0x02953230>, <__main__.Teams object at 0x029532B0>, etc etc
4

4 に答える 4

1

主にモジュールのドキュメントの例に基づいて、 csv モジュールを使用してこのようなことを行います。微調整が必​​要な場合があります。これは私の頭の中で思い浮かんだことですが、これらの種類のファイルを操作するときは常に関連するものを使用します。

import csv

with open('teams.csv', 'rb') as csvfile:
    teamreader = csv.reader(csvfile)
    for row in teamreader:
        newTeam = Teams(row[0], row[1], row[2], row[3])
        teamList.append(newTeam)
于 2013-01-05T00:03:07.113 に答える
0

オブジェクトの位置、オブジェクトがどのように印刷されるかです。厳密に言えば、リストの各要素の呼び出しstrまたは呼び出し。デフォルトでは、オブジェクトは のようなものを返します。クラスにメソッドを定義することで、これをオーバーライドできます。ただし、これはあなたがここで望んでいるようには聞こえません。reprlistreprrepr(team)Teams<main.Teams object at 0x02953230>__repr__Teams

TeamListTeamsオブジェクトのリストで、それをTeamNameメンバーのリストに変換したい場合は、 a を使用してlist comprehension変換します。

TeamNameList = [team.TeamName for team in TeamList]

これはまだ正確に印刷したいわけではないことに注意してください。

>>> print TeamNameList
['North Carolina', 'South Carolina', 'West Carolina', 'East Carolina', 'Underground Carolina', 'Cloud-level Carolina', 'Past Carolina', 'Future Carolina'] # those are all states, right?

おそらく次のようなものが必要です。

>>> print ', '.join(TeamNameList)
North Carolina, South Carolina, West Carolina, East Carolina, Underground Carolina, Cloud-level Carolina, Past Carolina, Future Carolina

あなたのコメントから:

後の関数 simGame(teamA, Teamb) があります

インスタンスが表示されますが、2 番目の関数でそれらを呼び出す方法がわかりません。私は彼らを名前で呼ぶつもりでした。私が示した例では、North_carolina を後で (関数は示されていません) に渡すことができ、データに対して計算を実行できます。

私はあなたがここで何を望んでいるのか理解していると思います。ノースカロライナとサウスカロライナの間のゲームをシミュレートできるようにしたいのですが、手元にあるのはTeamList.

これを行うには、おそらく次のように、名前をオブジェクトにdictマッピングするを作成する必要があります。Teams

TeamDict = {team.TeamName: team for team in TeamList}

これで、次のようなことができます。

simGame(TeamDict['North Carolina'], TeamDict['South Carolina'])

次に、クラスsimGameのノースカロライナとサウスカロライナのインスタンスを引数として取得するため、次のようなことができます。TeamsteamAteamB

def simGame(teamA, teamB):
    scoreA = int(teamA.FT * 1 * 20) + int(teamA.FG * 2 * 40) + int(teamA.Three * 3 * 10)
    scoreB = int(teamB.FT * 1 * 20) + int(teamB.FG * 2 * 40) + int(teamB.Three * 3 * 10)
    if scoreA > scoreB:
        print 'Home team {} beats visitor {} by {}!'.format(teamA.TeamName,
                                                            teamB.TeamName,
                                                            scoreA - scoreB)
    else:
        print 'Visitors {} win by {} over {} at home!'.format(teamB.TeamName,
                                                              scoreB - scoreA,
                                                              teamA.TeamName)

それはあなたが望むものですか?

いくつかの追加コメント:

を使用してリスト内包表記と同じことを行うこともできます。これにより、2 回map記述する必要がなくなりteamますが、通常の式構文を使用できないことも意味します。

TeamNameList = map(operator.attrgetter('TeamName'), TeamList)

または、mapと一緒に使用しlambdaて、式の構文を元に戻すこともできます...そして の繰り返しteam:

TeamNameList = map(lambda team: team.teamName, TeamList)

しかし、このような場合、リスト内包表記は一般的に Pythonic な方法であると考えられています。(また、Python 3 に移行しても変化しませんが、aからイテレーターにmap変化すると、次のような結果が得られますが、それでも機能します。)listprint TeamNameList<builtins.map at 0x108022350>', '.join(TeamNameList)

補足として、標準 (PEP 8) の Python スタイルでは、通常、クラスのみがこのように TitleCase になり、変数と属性は lower_case になります。CamelCase が本当に好きなら、lowerFirstCamelCase を使用することもできますが、TitleCase を使用すると、コードを読んでいる人が混乱し、TeamNameクラスが定義されている場所をすぐに見つけようとします。bvukelic からのコメントも参照してください。

別の補足として、あなたは多くの繰り返しコードを実行しているようですが、その理由はわかりません:

  name = info[0]
  FT = info[1]
  FG = info[2]
  Three = info[3]
  newTeam = (name, FT, FG, Three)

にコピーinfoしているだけですnewTeam。再び使用されることのない中間変数をすべて追加するのはなぜですか?

  newTeam2 = Teams(newTeam[0],newTeam[1],newTeam[2],newTeam[3])

そのすべてを次のように置き換えることができます。

  newTeam2 = Teams(info[0],info[1],newTeam[2],newTeam[3])

あるいは:

  newTeam2 = Teams(*info)

表示されていない別の変数が必要な場合は問題ありませんが、それでも必要ない可能性がありnewTeamます。これを行うだけです:

  newTeam2 = Teams(name, FT, FG, Three)
于 2013-01-04T23:28:30.057 に答える
0

質問の別の解釈をカバーするために:

class Teams(object):
    def __init__(self, TeamName, FT, FG, Three):
        self.TeamName = TeamName
        self.FT = FT
        self.FG = FG
        self.Three = Three

    def __str__(self):
        return str(self.TeamName)

    def __repr__(self):
        return self.__unicode__()

オブジェクトを印刷すると、次のように表示されます。TeamName

于 2013-01-04T23:46:59.750 に答える
0

__str__()クラス インスタンスがどのように表示されるかは、カスタム メソッドや__repr__()変換メソッドを与えることによって制御されます。これを行うためにコードを記述し、PEP 8 Style Guideの多くの推奨事項に従うようにする方法の 1 つを次に示します。他の人がすでに示唆しているように、モジュールを使用してファイルを読み取ることで、さらに改善または簡素化できる場合もありますがcsv、主に質問に示されているコードに焦点を当てます。

class Team(object):
    def __init__(self, team_name, free_throws, field_goals, three_pointers):
        self.team_name = team_name
        self.free_throws = free_throws
        self.field_goals = field_goals
        self.three_pointers = three_pointers

    def __repr__(self):
        return '{}({!r}, {}, {}, {})'.format(self.__class__.__name__,
                                             self.team_name, self.free_throws,
                                             self.field_goals, self.three_pointers)

def get_data(fname):  # fname is a csv file with 4 columns and one header row
    teams = []
    with open(fname, 'rt') as csv_file:
        csv_file.next()  # skip header row
        for line in csv_file:
            info = line.strip().split(",")
            teams.append(Team(*info))  # create a Team instance and add it to list
    return teams

print get_data("Stats 01-04-2013.csv")

出力例:

[Team('North Carolina',  .643,  .458,  .371), Team('Michigan',  .543,  .358,  .271)]
于 2013-01-05T03:08:26.060 に答える