RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 729156
Accepted
Екатерина Нагорная
Екатерина Нагорная
Asked:2020-10-11 02:51:33 +0000 UTC2020-10-11 02:51:33 +0000 UTC 2020-10-11 02:51:33 +0000 UTC

在python 2.7中按字母和单词的数量对句子列表进行排序

  • 772

我开始学习 Python 2.7。有必要按字母和单词的数量对句子列表进行排序。歌曲 - 实际上是带有列表本身的文件。

排序,我怀疑,有必要使用密钥,但我仍然没有足够的想法。

song = sys.argv[1]
w = open(song)
for line in sorted(w, key = int(len(line)))   
    print line
python
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    insolor
    2020-10-11T03:16:27Z2020-10-11T03:16:27Z

    参数key必须是一个函数,它接受当前元素并返回一个值作为排序依据。在这种情况下,它非常简单len(将长度转换为整数是不必要的,因为len它无论如何都会返回一个整数):

    song = sys.argv[1]
    w = open(song)
    for line in sorted(w, key=len)   
        print line
    

    在更复杂的排序情况下,您可能需要创建一个 lambda 函数(甚至将代码移动到一个单独的命名函数中)。

    要按字数排序,可以使用 string 方法按空格字符拆分字符串split,然后按结果块数排序:

    song = sys.argv[1]
    w = open(song)
    for line in sorted(w, key=lambda x: len(x.split()))
        print line
    

    要按单词数对行进行排序,并按字母数对行中的单词进行排序,您可以这样做:

    首先,我们简单地创建一个字符串列表,将每个字符串分解为单词:

    lines = [line.rstrip().split() for line in file]
    

    在字符串中添加单词排序(这是同一个字符串,只是添加了排序):

    lines = [sorted(line.rstrip().split(), key=len) for line in file]
    

    我们添加按单词数对行进行排序(用迭代器替换列表生成器 - 圆括号而不是方括号):

    lines = sorted((sorted(line.rstrip().split(), key=len) for line in file), key=len)
    

    因为 行已经被分词了,那么你就split不需要再做一次了,只需按列表的长度排序即可。

    好吧,当显示在屏幕上时,我们将单词列表收集回整行:

    for line in lines:
        print ' '.join(line)
    

    添加。正如jfs在答案的评论中正确指出的那样,如果文件被保存,例如,以utf-8(通常,任何非单字节编码),那么将不会有字符数,而是一个字节计数,加上由 unicode 空白字符分割将不起作用。

    要以所需编码打开文件,您需要使用io.open(). 打开时,将使用系统默认编码。要使用特定的编码,您可以在打开时指定它:

    import io
    ...
    w = io.open(song, encoding='utf-8')
    
    • 2
  2. jfs
    2020-10-18T17:13:27Z2020-10-18T17:13:27Z

    sentences要按字数对句子列表进行排序:

    sentences.sort(key=word_count)
    

    其中函数word_count()接受一个句子并返回其中的单词数。

    如果您还希望单个句子中的单词按字母数排序,那么您应该将每个句子分成单词并对单词进行排序:

    words = get_words(sentence)
    words.sort(key=char_count)
    

    在这里get_words(),该函数接受一个句子并返回其中的单词列表。char_count()该函数接受一个单词并返回其中的字母数。

    函数 word_count、get_word、char_count 的具体外观基本上取决于任务。

    例如,如果在命令行中给出的输入文件包含一个新行的句子,并且单词只是用空格分隔,那么按照句子中的单词数对句子进行排序,句子中的单词按照字母数:

    #!/usr/bin/env python
    import io
    import sys
    
    with io.open(sys.argv[1]) as file:
        sentences = file.read().splitlines()  # NOTE: line ends are not included
        result = sorted([sorted(get_words(s), key=char_count)
                         for s in sentences], key=word_count)
    
    for words in result: # for each sentence
        print(' '.join(words))
    

    在哪里:

    get_words = unicode.split  # split on arbitrary whitespace
    word_count = len           # number of items in the list of words
    char_count = len           # unicode word length
    

    代码注释:

    • io.open()用于将文本读取为 unicode,而不是字节(使用locale.getpreferredencoding()编码)。一个单词中的字节数可能与其中的字符数不匹配。请参阅字符串长度被认为不正确
    • unicode.splitlines()返回字符串列表,去掉行尾
    • unicode.split()在任意空格处断开字符串(不仅u' ',而且例如U+00A0 也理解非断开空格)。或者,可以使用正则表达式来获取单词列表:

      import re
      
      words = re.findall(r'\w+', sentence, flags=re.UNICODE)
      

      例如,如果您不想将标点符号视为单词的一部分,这很有用(如果您只是用空格将其分开,那么点和逗号会保留在单词中)

    • word_count = len之所以有效,是因为每个句子都作为单词列表在代码中表示

    • unicodePython 中的对象是不可变的字符序列(Unicode 代码点),因此char_count = len. 也就是说,字母的数量被认为等于单词中的字符数量。值得注意的是,一个可见的字母可能由几个字符组成:

      >>> len(u"ё")
      2
      >>> u"ё"
      u'\u0435\u0308'
      

      为了在文本中移动,为了在 GUI 中复制,我们不希望只得到一半的字母。请参阅将 Python 3 中的单词拆分为字符

      此外,还有所谓的 python 2 可执行文件的“窄”构建,其中非 BMP 字符,如U+1F602 (FACE WITH TEARS OF JOY)表示为代理对(抽象被破坏 - 实现中的缺陷)。在“宽”构建(通常在 Linux 上)或 Python 3 中不存在此问题:索引(Unicode)字符串不会破坏字符(Unicode 代码点):

      >>> print(u'\U0001f602')
      😂
      >>> len(_)
      1
      
    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5