【问题标题】:Quickly alphabetize a large file via python通过python快速按字母顺序排列大文件
【发布时间】:2009-12-08 23:12:03
【问题描述】:
#!/usr/bin/python

import random
import string

appendToFile = open("appendedFile", "a" )

# Generator

for i in range(1, 100000):

    chars = "".join( [random.choice(string.letters) for i in xrange(15)] )
    chars2 = "".join( [random.choice(string.letters) for i in xrange(15)] )

    appendToFile.write(chars + ":" + chars2 + "\n")

appendToFile.close()

代码修改自this question

以上代码生成 100,000 行随机文本,格式为 STRING:STRING。结果文本文件为 3.1 MB。

如何使用 STRING:STRING 中的第一个 STRING 快速按字母顺序排列文件? 大小写无关。

冒泡排序很慢,不是吗?

【问题讨论】:

  • 我们是要利用它可以适应现代机器上的 RAM 的事实,还是需要像真正的 Unix sort(1) 命令这样可以将中间结果缓存到磁盘和所以要处理无限大小的文件?
  • 内存过剩的优势。

标签: python file alphabetical


【解决方案1】:

显而易见的第一种方法是简单地使用 Python 中的内置排序功能。这不是你的想法吗?如果不是,为什么?只有 100,000 行随机文本,内置排序会非常快。

lst = open("appendedFile", "rt").readlines()
lst.sort(key=str.lower)

完成。如果您真的想这样做,我们可以将其作为单线:

lst = sorted(open("appendedFile", "rt").readlines(), key=str.lower)

编辑:我刚刚检查过,strings.letters 包括大写和小写字母。所以,上面的代码被修改为不区分大小写。

编辑:更多关于 Python 排序的信息:http://wiki.python.org/moin/HowTo/Sorting

【讨论】:

  • 如果不是,为什么? - python XD 的新手。我创建了该代码,以便您可以使用一个文件。
  • 仅供参考,用于列表的内置 Python 排序是合并排序。复杂度 O(n*log n)。
【解决方案2】:

这非常快(在我的电脑上不到 1 秒)。它使用不区分大小写的排序,即假设您所说的“大小写无关”是什么意思?

#!/usr/bin/python

appendToFile = open("appendedFile", "r")
sortToFile = open("sortedFile", "w")

for line in sorted(appendToFile, key = str.lower):
    sortToFile.write(line)

【讨论】:

  • 为什么不直接:... sorted(..., key=str.lower)
【解决方案3】:

试试这个(不区分大小写):

l=file(appendedFile).readlines()
l.sort(key=lambda x:x.lower())

对于这些类型的尺寸优化并不是真正必要的(我的慢机器上的时间;-):

christophe@orion:~$ time python -c "l=file('appendedFile').readlines();l.sort(key=lambda x:x.lower())"

real    0m0.615s
user    0m0.576s
sys 0m0.024s

【讨论】:

  • 感谢计时机制 - 不知道它存在。
  • Linux 下可以使用“time”命令。它可能在 Mac OS X 下可用。您也可以在 Windows 上获得它,但 Microsoft 没有内置它。在 Windows 上获得它的最简单方法是安装 Cygwin。一个纯粹基于 Python 的方法,因此是可移植的,是使用“timeit”模块:docs.python.org/library/timeit.html
  • @CrhistopheD,你不需要lambda 函数;你可以使用:key=str.lower
猜你喜欢
  • 1970-01-01
  • 2015-12-09
  • 2016-07-23
  • 2023-04-04
  • 2018-07-14
  • 2012-11-28
  • 1970-01-01
相关资源
最近更新 更多