我如何对很多列表进行排序以获得python中的前10名?

时间:2013-10-19 23:24:00

标签: python list

我得到了一个.txt文件,里面填充了很多这种结构的行。

["saelyth", 17896, 96511, 4733, "0", "F00", "0", 11, 1, "ffg, ghks"]
["example", 765, 3873, 342, "000", "F63", "5", 15, 1, "ffg"]
["whatever", 158, 756, 36, "000", "000", "0", 13, 0, "ffg, jdhs"]
["okay", 12680, 64548, 4469, "000", "0CC", "1", 15, 9, "ffg"]
["randomname", 5668, 30105, 1752, "0", "360", "0", 14, 7, "ffg"]
["something", 24798, 132792, 5764, "000", "000", "0", 12, 3, "ffg"]

到目前为止,我一直在使用json.loads逐行加载。但现在我想使用值[3]作为关键字列表中的前10位(按升序排列)。

我该怎么做?我正在谷歌搜索如何排序的工作但我不认为我可以使用它而不打破列表并仅提取该值,然后我无法在Top10打印中显示正确的列表:\

我尝试将其转换为元组,但它不会保存文件,也不知道为什么。

    leyendotop10 = open("textfiles\estadisticas\Estadisticas.txt", "r")
    top10leido = leyendotop10.read()
    leyendotop10.close()

    print("Readed")
    atuple1 = top10leido.replace("[", "(")
    atuple2 = atuple1.replace("]\n", "), ")
    listitaglobaldetop10 = []
    listitaglobaldetop10.append(atuple2)
    print("Fixed")
    sorted(listitaglobaldetop10, key=lambda stats: stats[1])
    print("Ordered")

    grabandotop10 = open("textfiles\estadisticas\top10.txt", "a")
    grabandotop10.write(str(listitaglobaldetop10))
    grabandotop10.close()
    print("Saved")

任何虽然或更简单的方法来做我想做的事情?

信息: IDLE 3.3.2,文本文件包含4300个列表。

3 个答案:

答案 0 :(得分:4)

# reading the file
with open(filename, 'r') as infile:
    lines = list(json.loads(x) for x in infile)

# the important part
top_10_lines = sorted(lines, key = lambda line : line[3], reverse = True)[0:10]

# to write the top 10 file:
with open(other_filename, 'w') as outfile:
    for line in top_10_lines:
        print(json.dumps(line), file = outfile)

如果您愿意,可以使用heapq.nlargest代替sorted来获得前10名。

您也可以省略列表(包括或不包含'nlargest'),但前提是您的代码不需要使用lines进行其他操作:

# reading the file
with open(filename, 'r') as infile:
    top_10_lines = heapq.nlargest(
        10,
        (json.loads(x) for x in infile),
        key = lambda x : x[3],
    )

这应该使用更少的内存,并且可能更快。既然你的文件很小,几百KB,这可能不是什么大问题。对于只需要少量线条的大型文件,它会产生明显的差异。

答案 1 :(得分:3)

我认为你可以简化一下。假设你的文本文件如图所示。您可以按行如下所示逐行阅读:

from ast import literal_eval
lines = []
with open(infile_path, 'r') as infile:
    for line in infile:
        line = literal_eval(line)
        lines.append(line)

现在你已经有了一个文件行的列表(名为lines),由于它们的结构,它们已经可以解释为Python类型(literal_eval位解释文本)

现在按照你可以做的一个条目对它们进行排序(这里我按索引3条目排序):

lines.sort(key = lambda x: x[3])

这里我使用lambda expression返回每个项目中的索引3条目。有关详细信息,请参阅Sorting HOW TO

完成后,您可以选出前10名并将其写入您的文件:

with open(outfile_path, 'w') as outfile:
    for line in lines[-10:]:
        print(line, file=outfile)

答案 2 :(得分:0)

这应该做你想要的。您需要将数据写入新文件。

def item_one(sequence):
    """Returns int(sequence[1]).
    """
    return int(sequence[1])

data = []
with open('file.txt') as f:
    for line in f:
        # strip the line terminator and brackets
        line = line.strip().strip('[]')
        # make it into a list
        line = line.split(',')
        #save it for later
        data.append(line)

data.sort(key = item_one)
print data[-2:]

# or
data.sort(key = item_one, reverse = True)
print data[:2]