【问题标题】:Use a word in a string to create an object in Python在 Python 中使用字符串中的单词创建对象
【发布时间】:2015-08-09 00:26:37
【问题描述】:

这里是非常新的python程序员。

我正在尝试获取人员姓名和信息的列表(在本例中为棒球运动员),并根据这些字符串中的其他信息为每个球员创建一个具有属性的不同对象。例如,我将以下人员列表存储在名为 my_players 的列表中(当然,我的实际玩家列表要长得多):

SS Derek_Jeter Yankees
P Johan_Santana Mets
C Ivan_Rodriguez Tigers

我想创建 Player 类的对象,其中 Player 定义为:

class Player():
    def __init__(self,full_name,pos,team_name):
        self.name = full_name
        self.position = pos
        self.team = team_name

但我不想手动创建每个对象,我想使用 for 循环,对于 my_players 中的每个字符串,使用字符串中的第二个单词作为对象的名称,然后是三个字符串的一部分作为属性。也就是说,我需要一个名为 Derek_Jeter 的对象,它具有 Derek_Jeter、SS、Yankees 的属性,以及另一个名为 Johan_Santana 的对象和另一个名为 Ivan_Rodriguez 的对象,但我不想将这些对象名称中的每一个都输入到我的代码中。我怎样才能以这种方式创建对象?

【问题讨论】:

标签: python


【解决方案1】:

给你:

content = """SS Derek_Jeter Yankees
P Johan_Santana Mets
C Ivan_Rodriguez Tigers"""

lines = content.split("\n")

players = []
for x in lines:
  pos, name, team = x.split(' ')
  players.append( Player(name, pos, team) )

# players is a list of the Player objects

【讨论】:

  • 不! jaimeg 正在学习不要给他们答案,来吧。
  • @user5402 但这不是意味着 Jeter 的对象将被称为 player[0] 吗?如何从列表中创建一个名为 Jeter 的对象?显然我可以写 Jeter = player[0] 但我试图避免必须为每个玩家命名。
  • 您将编写一个函数findPlayer(name, playerlist),该函数将返回playerlist 中具有指定名称的播放器对象。
【解决方案2】:
players = [('SS', 'Derek_Jeter', 'Yankees'), 
           ('P', 'Johan_Santana', 'Mets'), 
           ('C', 'Ivan_Rodriguez', 'Tigers')]
player_objs = [Player(name, position, team) for position, name, team in players]

编辑:抱歉,我误读并认为球员位置、姓名和球队已经在列表中。

鉴于您的字符串“玩家列表”:

player_strings = """SS Derek_Jeter Yankees
                 P Johan_Santana Mets
                 C Ivan_Rodriguez Tigers"""

您可以使用以下方法将其转换为适当的列表:

players = [line.split(' ') for line in content.split('\n')]

这大致相当于@User5402的这部分代码:

lines = content.split("\n")
players = []
for x in lines:
    pos, name, team = x.split(' ')

这是 Python 中一个有用的功能,称为列表推导:https://docs.python.org/2/tutorial/datastructures.html#list-comprehensions

如果你想将@User5402 的代码压缩成一行,那就是:

player_objs = [Player(name, position, team) for position, name, team in [line.split(' ') for line in content.split('\n')]]

如果您希望能够按名称呼叫玩家,您可以使用字典推导式创建一个字典,将您的 Player() 对象作为值(参见:Create a dictionary with list comprehension in Python 了解更多示例):

player_objs_dict = {name:Player(name, position, team) for position, name, team in [line.split(' ') for line in content.split('\n')]}

然后您可以通过以下方式获取玩家对象:

#will return the Derek Jeter object
player_objs_dict['Derek_Jeter']

【讨论】:

  • 能否请您 edit 解释为什么这段代码回答了这个问题?纯代码答案是discouraged,因为它们不教授解决方案。 (这似乎对命名变量,甚至数组索引或字典键或任何东西都没有太大作用,基于玩家名称。)
  • 我喜欢关于使用字典的建议。您还可以考虑使用defaultdict(list) 来处理多个玩家同名的情况。然后字典的每个值将是一个Players 列表,对应于作为键的名称。
【解决方案3】:

[Player(x,y,z) for y,x,z in map(lambda s: tuple(s.split()),my_players)]

应该创建对象列表(如果你想要一个 1-liner)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    • 2018-08-06
    • 1970-01-01
    • 2011-09-10
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多