重新订购三个清单并维持指数之间的关系?

时间:2014-01-22 20:02:28

标签: python list

尝试创建一个高分系统,用户可以搜索名称并返回该人员获得的所有分数以及他们对其进行评分的“单词”(几乎就像一个级别/阶段)。 (它是一个刽子手/单词猜测型游戏。)

我现在拥有的系统有一个主列表,例如从文本文件导入:

word1
score1
name1
word2
score2
name2
...

然后我将此列表拆分为其他三个列表:

list = [ word1, word2 ... ] 

list_scores = [ score1, score2 ... ] 

list_names = [ name1, name2 ... ]

(分数以时间表示,并且浮点数四舍五入到3个小数点)

这种方式的工作方式是每个列表中的每个元素都对应于同一索引的另外两个列表中的元素。

>>>print "%s solved %s in %r seconds" % ( list_names[0], list[0], list_scores[0] )
Josh solved dog in 1.009 seconds

我的任务是,我想允许用户在list_names中搜索名称,然后让它根据时间按顺序返回所有分数,但保持列表中的名称和单词连接。


我最初尝试接受输入并遍历list_names以查找任何匹配项,然后使用相同的索引打印上述语句以用于所有三个列表。这个问题是它按照我想要的方式运行,但结果不是按顺序

以下是我目前的情况:(事先为结构不良的代码道歉)

search2 = raw_input('>')
print "\n [-- Fastest Times --]\n"
print "  *reload script to update*\n"
  for i,x in enumerate(list_names):
    if search2 in x:
    lni = list[i]
    print "%s - %r seconds by %s" % ( lni[:-1], list_scores[i], x )

(lni [: - 1]从每个单词中删除新的换行符)


我意识到我应该使用dicts或其他系统来组织数据,但是我已经围绕系统构建了整个游戏,并且最终确定了高分功能以尝试使用预先存在的结构游戏。

我计划在完成后重新编写这个项目,所以我确实感谢任何关于创建更高效​​或pythonic代码的评论。

1 个答案:

答案 0 :(得分:1)

zip,sort,unzip:

list_words, list_scores, list_names = zip(*sorted(zip(list_words, list_scores, list_names)))

我还将list重命名为list_words以防止名称冲突

zip documentation

要解释*参数打包,请理解以下两个调用是相同的:

function(1, 2, 3)
function(*[1, 2, 3])

列表[1, 2, 3]被“解压缩”,并且它的每个元素作为参数传递给函数。因此,您可以通过“解压缩”来轻松“重新组织”列表:

>>> zip(*[[1,2,3], ['a', 'b', 'c']])
[(1, 'a'), (2, 'b'), (3, 'c')]

(请注意,Python 3需要在此输出上调用list()以查看底层结构)

argument unpacking documentation