【问题标题】:Splitting Python List Into Multiple Variables将 Python 列表拆分为多个变量
【发布时间】:2017-08-02 02:47:19
【问题描述】:

大家好,我正在尝试为我的 Snake 游戏制作排行榜。我有一个排序工作并将排序后的文件读回从底部到顶部的列表(我发现的排序是升序,我需要降序)。

这是打印后的列表:

['', '47389094, purple', '', '9993, red', '', '34, Bobo', '', '19, Bob', '', '8, Jon', '', '1, Cameron']

我想要 10 个单独的变量来存储前 10 个值。 我需要将它们存储为“47389094 - 紫色”和“9993 - 红色”等,以便它们可以显示在 PyGame 窗口的有序表中。

我试图弄清楚这个列表拆分,但我找不到任何与我想要的类似的例子。

这可能是一种低效的方法,因此如果有人有其他想法,那将是一个巨大的帮助。谢谢。

编辑 -

这是对文件进行实际排序的代码:

with open('Leaderboard.csv') as sample, open('LeaderBoardSort.csv', "w") as out:
    csv1=csv.reader(sample)
    header = next(csv1, None)
    csv_writer = csv.writer(out)
    if header:
        csv_writer.writerow(header)
    csv_writer.writerows(sorted(csv1, key=lambda x:int(x[0])))

这个建议最初有效,但现在抛出 IndexError: list index out of range。除了在排行榜中添加更多内容之外,我无法弄清楚我改变了什么来打破它。 - 现在已修复,我删除了逗号和括号之间的空格。

nl = [x.split(', ')[0] + ' - ' + x.split(', ')[1] for x in name if x]

【问题讨论】:

  • 我不明白你在问什么。您显示的列表有六个真实项目和六个空字符串,但您似乎想要十个项目?除了摆脱空字符串之外,您还想有什么不同?它只是改变破折号的逗号吗?您能否展示您正在使用的生成列表的代码(因为修复将空字符串放入列表的代码可能比在它们存在后将其剥离更容易)?
  • 列表将有十个项目,尚未全部添加。我可能应该把它们都放进去。
  • 多余的空格通过排序添加到CSV文件中。我不确定如何在评论中添加代码块,所以就是这样:以 open('Leaderboard.csv') 作为示例, open('LeaderBoardSort.csv', "w") 作为输出: csv1=csv.reader(示例) header = next(csv1, None) csv_writer = csv.writer(out) if header: csv_writer.writerow(header) csv_writer.writerows(sorted(csv1, key=lambda x:int(x[0])))
  • 不要将代码放在注释中。而是edit您的问题包含相关代码。
  • 好的,我会这样做的。

标签: python list sorting split leaderboard


【解决方案1】:

您可以使用 split,如您所说,将 ', ' 作为拆分字符串。然后,我使用列表理解创建一个新列表,其中包含您想要的连字符分数/名称。 (if x 是用来忽略空字符串的,[:10] 保证你只得到前十的分数(当然这里没有排序,所以它只会得到前 10 个元素)

pygame.font.init()     #initialize pygame font module
myfont = pygame.font.SysFont('Comic Sans MS', 30)

scores = ['', '47389094, purple', '', '9993, red', '', '34, Bobo', '', '19, Bob', '', '8, Jon', '', '1, Cameron']

nl = [x.split(', ')[0] + ' - ' + x.split(', ')[1] for x in scores if x and len(x.split(', ')) == 2][:10]

for item in nl:
    score = myfont.render(item, False, (0, 0, 0))
    screen.blit(score,(0,0))

我认为这应该可以完成您所追求的目标。

【讨论】:

  • 效果很好,但它仍然是一个列表,我需要使用多个变量来存储列表的每个单独部分,或者找到一种在 PyGame 窗口中垂直而不是水平显示列表的方法。你能解释一下什么是元组列表吗?这可能是一个更好的解决方案,学习新东西总是好的。感谢您的帮助。
  • 另外我需要它只显示列表中的前 10 个。
  • 这由于某种原因停止工作,它现在显示 IndexError: list index out of range。我通过添加和删除值稍微更改了 CSV 文件,这应该发生吗?
  • 您仍然使用列表来显示 PyGame 中的内容。 #initialize font myfont = pygame.font.SysFont("monospace", 15) #loop through fonts for item in nl: label = myfont.render(item, 1, (255,255,0))` screen.blit(label, (100, 100))
  • 我修复了删除逗号和括号之间的空格的错误。不知道为什么它有效,但它确实有效。现在我只需要在屏幕上正确格式化它。感谢您的帮助。
【解决方案2】:

回过头来,也许加载列表的过程可以重构为在字典中插入/更新记录?

由于顺序很重要,您可以使用 OrderedDict: https://docs.python.org/2/library/collections.html#collections.OrderedDict

【讨论】:

  • 这看起来是个好主意,我不确定我是否有时间实施这样的解决方案,尽管我需要在星期一之前完成它并且仍然有相当多的文档和测试(!)去做。可以肯定地说我有点晚了。
猜你喜欢
  • 2017-02-25
  • 1970-01-01
  • 1970-01-01
  • 2020-02-10
  • 2018-11-25
  • 1970-01-01
  • 2019-06-05
  • 2018-05-13
  • 1970-01-01
相关资源
最近更新 更多