有更好的方法吗?我觉得那么多因为不能好。
请注意,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。
答案 0 :(得分:1)
这样的事情可以简化您的代码。
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 nice list和dicts syntax sugar来完成一行中的工作:
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。
答案 1 :(得分:1)
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变量名:)