【问题标题】:Search list of dictionaries for name python搜索名称 python 的字典列表
【发布时间】:2012-11-28 00:37:30
【问题描述】:

我有一个字典列表,每个字典都有这样的数据:

'Caitlyn': {'date': (2012, 11, 24), 'player': 'Caitlyn', 'outcome': 'Win', 'gameid': '00006', 'stats': {'assists': 6, 'kills': 13, 'deaths': 4}}

我从具有如下行和数据的文件中生成每个项目:

[00006] Caitlyn - 13/4/6 - Win - 2012-11-24

我想在字典列表中获取匹配玩家姓名的所有索引并打印它们和/或打印其中的数据。我可以打印所有列表并将其格式化以匹配我的文件等,但我不确定如何搜索它,因为它与我在此进行的其他搜索有点不同。

我可以用这个打印整个数据集(我知道很难看,但它有效):

i = 0
for item in records:
    print "\n", "[%s] %s - %s/%s/%s - %s - %s-%s-%s" % (records[i][0], records[i][1]['player'], records[i][1]['stats']['kills'], records[i][1]['stats']['deaths'], records[i][1]['stats']['assists'], records[i][1]['outcome'], records[i][1]['date'][0], records[i][1]['date'][1], records[i][1]['date'][2])
    i = i + 1

有人可以帮忙吗?我需要能够在其中搜索玩家姓名并打印出每个匹配项(并返回索引,以便我可以使用匹配的集合来处理其他内容,而不是再次运行整个搜索),我想我想返回匹配列表,以便我可以使用它们或导出它们或其他任何东西。感谢您的帮助!

[编辑] 由于到目前为止似乎有更多的问题而不是答案,这里是到目前为止的整个文件: http://www.pasteall.org/37589/python

这是 stats4.txt: http://www.pasteall.org/37590

【问题讨论】:

  • 作为开始,您可以使用 enumerate 并省去跟踪递增计数器的麻烦,即for i, item in enumerate(records):
  • 字典列表,还是包含字典的字典?列表不能有命名条目 ('Caitlyn': {...)
  • 更好的是,只需删除循环计数器。在循环内部,item is records[i]。另外,player 字段有什么作用?您那里有重复的信息。
  • 我发布的字典示例是列表中的一项,输入统计文件的每一行都有其他项,播放器字段在那里,因为我想不出另一种方法来获得它输出,而不必直接引用玩家名称来获取数据

标签: python list search dictionary dataset


【解决方案1】:

很高兴在这样一个意想不到的地方遇到另一个召唤师。

如果您想跟踪与特定英雄一起玩的所有游戏,您可以构建另一个字典,其中英雄名称为键,游戏统计列表为值。

代码应该是这样的。

records = {}

for line in data:
    # parsing codes

    # store player -> gameid mappings to the index
    if player not in records:
        records[player] = []
    records[player].append(info)

print records['Sona']
# this should print out list of games played with Sona

此更改将使您的数据可以按英雄名称访问,但不再按游戏 ID 排序。如果您仍然需要通过游戏 ID 访问您的数据,我建议您按游戏 ID 存储数据,并构建另一个字典来对其进行索引。这取决于您要如何处理数据。

另外,如果你想对这些数据做一些认真的分析,你应该考虑使用一些python的数据库绑定,比如sqlite3,它包含在标准库中。数据库是专为此类任务设计的应用程序。

【讨论】:

  • 谢谢你看看我能不能让它按我的需要工作:) 是的,数据库当然是理想的,但我不需要那么大的东西,这只是我的第一个小 python 程序:) 我可以将统计数据写入文件(并且我还有另一个冠军名称文件,我查找它以确保输入有效的内容,它还支持诸如 tf、mf、kog 之类的缩写),现在只是显示它们,然后我会尝试做一些跟踪和东西。再次感谢,我会尽力把它变成我所拥有的:)
【解决方案2】:

重组数据是否为时已晚?

>>> Caitlyn = {'games': [{'date': (2012, 11, 24),
                      'gameid': '00006',
                      'outcome': 'Win',
                      'stats': {'assists': 6, 'deaths': 4, 'kills': 13}}]}
>>> game02 = {'date': (2012, 11, 24),
              'gameid': '00007',
              'outcome': 'Loss',
              'stats': {'assists': 4, 'deaths': 3, 'kills': 16}}
>>> Caitlyn['games'].append(game02)

您为每个玩家使用一个字典列表,并将它们保存到他们自己的对象中,它可以很好地腌制,或者可以按原样在document-based no-sql database 中使用。尽管这确实消除了您迄今为止所做的很多工作,但回报是不错的。持久存储,无需解析/写入文本,并且能够使用数据库风格的逻辑来进行您所说的那种搜索。汇总统计数据是我想到的另一个好处。虽然这现在不能回答你的问题,但我希望你至少可以考虑这个选项。

【讨论】:

  • 我可以做到这一点,但我是 python 新手,我在这里尝试学习的部分内容是一些文本解析和格式化,所以我真的想把它保存在一种格式化好的东西中然后从中提取数据
  • 我在接受的答案下阅读了您的评论...我们都建议的数据库是基于文档的,并且设置起来非常非常快且易于使用。在扩展这个想法时,一定要记住 sqlite3 或 mongodb。此外,如果您决定让这个脚本更像一个程序,请尝试使用 VCS(我最喜欢 git)并开始学习这些技能。
猜你喜欢
  • 2012-01-29
  • 1970-01-01
  • 2022-11-12
  • 2013-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多