有没有更好的方法.?我觉得这么多都不好。
请注意,ListaOnline仅仅是一个用户名列表,这些用户名的昵称中通常有[]字符。我希望这不会让人困惑。
ListaOnline = ['[YOLO]someone', 'Another person', 'example']
ListaJugadores = [['[YOLO]someone', ['healer', 'tank']], ['example', ['healer', 'dps']]]
ListaMeta = Lista Meta: ['healer', 'tank', 'dps', 'dps', 'dps', 'support', 'support']
ListaResultado = [['healer', []], ['tank', []], ['dps', []], ['dps', []], ['dps', []], ['support', []], ['support', []]]
for i in ListaOnline: #for each player online
for j in ListaJugadores: #check players in database
if j[0] == i: #and if found
for k in ListaMeta: #for each role in the Meta
for l in j[1]: #for each item in player's roles
if k in l: #if the player has this role
for m in ListaResultado: #for each role in ListaResultado
if k in m: #if the role matches
m[1].append(i) #add player to the list
print(str(ListaResultado))
>>> [['healer', ['[YOLO]someone', 'example']], ['tank', ['[YOLO]someone']], ['dps', ['example']], ['dps', []], ['dps', []], ['support', []], ['support', []]]预期的输出是获得一个列表,每个播放器都添加到数据库中保存的角色中。ListaOnline、ListaJugadores和ListaMeta列表每天都会发生变化,因此每次代码运行时都需要检查新角色是否可用,并根据Meta中的预期角色填充ListaResultado。
发布于 2016-04-20 14:41:57
像这样的东西可以简化代码。
ListaOnline = ['[YOLO]someone', 'Another person', 'example']
DictJugadores = {'[YOLO]someone': ['healer', 'tank'], 'example': ['healer', 'dps'] }
ListaMeta = ['healer', 'tank', 'dps', 'dps', 'dps', 'support', 'support']
DictResultado = dict((role, []) for role in ListaMeta)
for user in ListaOnline: #for each player online
if user in DictJugadores:
for role in DictJugadores[user]:
DictResultado[role].append(user)
print(str(DictResultado))会给你:
{'healer': ['[YOLO]someone', 'example'], 'support': [], 'tank' : ['[YOLO]someone'], 'dps': ['example']}如果您不知道如何将列表转换为dicts:
def convert_list_to_dict(list_with_keys):
d = {}
for l in list_with_keys:
d[l[0]] = l[1]
return d而在相反的方向:
def convert_dict_to_list(my_dict):
l = []
for k, v in my_dict.iteritems():
l.append([k,v])
return l您还可以滥用python漂亮的列表并删除语法糖,从而完成一行工作:
DictResultado = dict( (r, [u for u in ListaOnline
if u in DictJugadores and r in DictJugadores[u]])
for r in ListaMeta )(这也是滥用python惰性的计算和表达式,以避免字典中的KeyError。也就是说,if u in DictJugadores and r in DictJugadores[u]中的顺序非常重要)。
但是我会使用for循环解决方案,因为它更清晰,更容易理解。正如编写实心代码书所建议的那样,你应该做干净乏味的代码,尽量避免滥用语言的特殊语法。
顺便说一句,我强烈建议您尝试在代码中遵循pep 8。
发布于 2016-04-20 14:47:08
ListaJugadores = [['[YOLO]someone', ['healer', 'tank']], ['example', ['healer', 'dps']]]可以通过以下方式更好地代表:
ListaJugadores = {'[YOLO]someone': ['healer', 'tank'], 'example': ['healer', 'dps']}这种方法很有用:现在您可以进行查找:
> ListaJugadores['[YOLO]someone]
> ['healer', 'tank']这是一本字典,最终可以扩展。也许你想包括一些更多的信息:
ListaJugadores = {'[YOLO]someone': {'roles': ['healer', 'tank'], 'last_login': '01-01-1990'}}查找的运行时也是O(1),即.真的很好。:)
这并不能让你一路顺风。如果您想要构建您的ListaResultado对象,您仍然需要做一些类似的事情。
ListaResultado = {'healer': [], 'tank': [], 'dps': []}
for user in ListaOnline:
if user in DictJugadores:
for role in DictJugadores[user]:
ListaResultado[role].append(user)但是,最终最好将其移到关系数据库中。然后你就可以查询所有的在线用户,并得到他们的角色!这将非常容易,并将您的数据模型转移到一个安全的地方。
此外,由于您正在学习:查看PEP8样式指南。Python约定使用under_score变量名:)
https://stackoverflow.com/questions/36746943
复制相似问题