这里非常新的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,但我不想在代码中键入每个对象名。如何以这种方式创建对象?
答案 0 :(得分:3)
你走了:
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
答案 1 :(得分:3)
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]
编辑抱歉,我误读并认为玩家的位置,名称和团队已经在列表中。
鉴于你的字符串' list'球员:
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']
答案 2 :(得分:0)
[Player(x,y,z) for y,x,z in map(lambda s: tuple(s.split()),my_players)]
应该创建对象列表(如果你想要1-liner)