我开始学习 Python 2.7。有必要按字母和单词的数量对句子列表进行排序。歌曲 - 实际上是带有列表本身的文件。
排序,我怀疑,有必要使用密钥,但我仍然没有足够的想法。
song = sys.argv[1]
w = open(song)
for line in sorted(w, key = int(len(line)))
print line
我开始学习 Python 2.7。有必要按字母和单词的数量对句子列表进行排序。歌曲 - 实际上是带有列表本身的文件。
排序,我怀疑,有必要使用密钥,但我仍然没有足够的想法。
song = sys.argv[1]
w = open(song)
for line in sorted(w, key = int(len(line)))
print line
参数
key必须是一个函数,它接受当前元素并返回一个值作为排序依据。在这种情况下,它非常简单len(将长度转换为整数是不必要的,因为len它无论如何都会返回一个整数):在更复杂的排序情况下,您可能需要创建一个 lambda 函数(甚至将代码移动到一个单独的命名函数中)。
要按字数排序,可以使用 string 方法按空格字符拆分字符串
split,然后按结果块数排序:要按单词数对行进行排序,并按字母数对行中的单词进行排序,您可以这样做:
首先,我们简单地创建一个字符串列表,将每个字符串分解为单词:
在字符串中添加单词排序(这是同一个字符串,只是添加了排序):
我们添加按单词数对行进行排序(用迭代器替换列表生成器 - 圆括号而不是方括号):
因为 行已经被分词了,那么你就
split不需要再做一次了,只需按列表的长度排序即可。好吧,当显示在屏幕上时,我们将单词列表收集回整行:
添加。正如jfs在答案的评论中正确指出的那样,如果文件被保存,例如,以utf-8(通常,任何非单字节编码),那么将不会有字符数,而是一个字节计数,加上由 unicode 空白字符分割将不起作用。
要以所需编码打开文件,您需要使用
io.open(). 打开时,将使用系统默认编码。要使用特定的编码,您可以在打开时指定它:sentences要按字数对句子列表进行排序:其中函数
word_count()接受一个句子并返回其中的单词数。如果您还希望单个句子中的单词按字母数排序,那么您应该将每个句子分成单词并对单词进行排序:
在这里
get_words(),该函数接受一个句子并返回其中的单词列表。char_count()该函数接受一个单词并返回其中的字母数。函数 word_count、get_word、char_count 的具体外观基本上取决于任务。
例如,如果在命令行中给出的输入文件包含一个新行的句子,并且单词只是用空格分隔,那么按照句子中的单词数对句子进行排序,句子中的单词按照字母数:
在哪里:
代码注释:
io.open()用于将文本读取为 unicode,而不是字节(使用locale.getpreferredencoding()编码)。一个单词中的字节数可能与其中的字符数不匹配。请参阅字符串长度被认为不正确unicode.splitlines()返回字符串列表,去掉行尾unicode.split()在任意空格处断开字符串(不仅u' ',而且例如U+00A0 也理解非断开空格)。或者,可以使用正则表达式来获取单词列表:例如,如果您不想将标点符号视为单词的一部分,这很有用(如果您只是用空格将其分开,那么点和逗号会保留在单词中)
word_count = len之所以有效,是因为每个句子都作为单词列表在代码中表示unicodePython 中的对象是不可变的字符序列(Unicode 代码点),因此char_count = len. 也就是说,字母的数量被认为等于单词中的字符数量。值得注意的是,一个可见的字母可能由几个字符组成:为了在文本中移动,为了在 GUI 中复制,我们不希望只得到一半的字母。请参阅将 Python 3 中的单词拆分为字符
此外,还有所谓的 python 2 可执行文件的“窄”构建,其中非 BMP 字符,如U+1F602 (FACE WITH TEARS OF JOY)表示为代理对(抽象被破坏 - 实现中的缺陷)。在“宽”构建(通常在 Linux 上)或 Python 3 中不存在此问题:索引(Unicode)字符串不会破坏字符(Unicode 代码点):