首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Y中X的太多

Y中X的太多
EN

Stack Overflow用户
提问于 2016-04-20 14:26:49
回答 2查看 92关注 0票数 1

有没有更好的方法.?我觉得这么多都不好。

请注意,ListaOnline仅仅是一个用户名列表,这些用户名的昵称中通常有[]字符。我希望这不会让人困惑。

代码语言:javascript
复制
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。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-20 14:41:57

像这样的东西可以简化代码。

代码语言:javascript
复制
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))

会给你:

代码语言:javascript
复制
{'healer': ['[YOLO]someone', 'example'], 'support': [], 'tank' : ['[YOLO]someone'], 'dps': ['example']}

如果您不知道如何将列表转换为dicts:

代码语言:javascript
复制
def convert_list_to_dict(list_with_keys):
    d = {}
    for l in list_with_keys:
        d[l[0]] = l[1]
    return d

而在相反的方向:

代码语言:javascript
复制
def convert_dict_to_list(my_dict):
    l = []
    for k, v in my_dict.iteritems():
        l.append([k,v])
    return l

您还可以滥用python漂亮的列表并删除语法糖,从而完成一行工作:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-04-20 14:47:08

代码语言:javascript
复制
ListaJugadores = [['[YOLO]someone', ['healer', 'tank']], ['example', ['healer', 'dps']]]

可以通过以下方式更好地代表:

代码语言:javascript
复制
ListaJugadores = {'[YOLO]someone': ['healer', 'tank'], 'example': ['healer', 'dps']}

这种方法很有用:现在您可以进行查找:

代码语言:javascript
复制
> ListaJugadores['[YOLO]someone]
> ['healer', 'tank']

这是一本字典,最终可以扩展。也许你想包括一些更多的信息:

代码语言:javascript
复制
ListaJugadores = {'[YOLO]someone': {'roles': ['healer', 'tank'], 'last_login': '01-01-1990'}}

查找的运行时也是O(1),即.真的很好。:)

这并不能让你一路顺风。如果您想要构建您的ListaResultado对象,您仍然需要做一些类似的事情。

代码语言:javascript
复制
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变量名:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36746943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档