Y中的X太多了

时间:2016-04-20 14:26:49

标签: python list

有更好的方法吗?我觉得那么多因为不能好。

请注意,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。

2 个答案:

答案 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变量名:)