当前位置: 首页 > 知识库问答 >
问题:

一个带有换行功能的Python文字处理函数

微生烨然
2023-03-14

我正在构建一个文字处理器,并尝试实现文字包装功能。

给定一行中的最大字符数,后跟一个单词列表,我想返回一个字符串集合,其中每行包含尽可能多的由空格连接的单词。每个字符串的长度不应超过最大长度。

  • 输出的每个字符串中的每个单词之间必须正好有一个空格
import sys

# Prints to standard output.
def wrapLines(line_length, words):
  curr_line = ""
  for word in words:
    if len(curr_line) + len(word) >= line_length:
      curr_line = ""
    else:
      curr_line += word
      print curr_line


def main():
  first_line = None
  words = []

  first_arg = True
  for line in sys.stdin:
    if len(line.strip()) == 0:
      continue

    line = line.rstrip()

    if first_arg:
      lineLength = line
      first_arg = False
    else:
      words.append(line)

  wrapLines(lineLength, words)

main()

输入:

13
abc
xyz
foobar
cuckoo
seven
hello

我的输出一直在打印所有的单词,而不是换行。

abc
abcxyz
abcxyzfoobar
abcxyzfoobarcuckoo
abcxyzfoobarcuckooseven
abcxyzfoobarcuckoosevenhello

预期产出:

abc xyz
foobar cuckoo
seven hello

共有2个答案

仲孙经赋
2023-03-14

首先,据我所知,您没有指定所需的线宽,因此我将根据您的预期输出假设14。就我个人而言,我认为这一切都可以简化为一个单一的函数,循环通过您的输入单词列表,如果它可以添加它而不超过行长度,它将添加到一个字符串,否则它将添加到我们的输出列表中的字符串(因为它无法处理下一个单词),然后重置字符串。我实现了一个while循环,因此在需要重置的迭代中,它不能简单地增加计数器(I在我的例子中),然后它将在下一次迭代中索引相同的位置,并且它将是第一个添加到新重置字符串的行。我用Python 3制作了这个。所以它在2中可能不起作用。但是如果是这样的话,它将是{code>'{}。格式化,您可以使用%运算符。在循环的末尾有另一个wrapped_单词。追加(current_line.strip()),这样我们也可以抓取最后一行。

我的解决方案:

words_input = ['13', 'abc', 'xyz', 'foobar', 'cuckoo', 'seven', 'hello']

def wrap_words(words_to_wrap, max_line_length):
    wrapped_words = []
    current_line = ''
    i = 0
    while i < len(words_to_wrap):
        if len(current_line) + len(words_to_wrap[i]) + 1 > max_line_length:  # +1 for the space
            wrapped_words.append(current_line.strip())
            current_line = ''
        else:
            current_line += '{} '.format(words_to_wrap[i])
            i += 1
    if len(current_line):
        wrapped_words.append(current_line.strip())
    return wrapped_words

print(wrap_words(words_input, 14))

输出:

['13 abc xyz','fobar cuckoo','七个你好']

公西星海
2023-03-14

这里有几个问题-最重要的一个是,您正在读取stdin中的第一行,并将其用作行长,但您没有将其转换为数字。因此,您在包装器函数中的lineLength(和line\u length)变量中的值是一个字符串,并且比较

 if len(curr_line) + len(word) >= line_length:

始终将左侧建议的输出行的长度与字符串进行比较-如果您使用最新版本的Python,这一行会出错,因为现在(正确地)禁止组合数字和字符串。然而,在Python 3中,此表达式始终为True-数字总是被视为

第二个错误是没有将空格连接到行字符串,而是用=连接单词,但不添加空格。

第三个错误是,您总是打印在循环内计算的行-无论是否超过行长度。

最后,但并非最不重要的是——正如我在上面的评论中所说的:不要再使用Python 2了——他们之所以使用Python 3是有原因的,这是因为语言不断发展。

而且,错误较少,但建议:您的函数应该只处理文本并返回数据——如果您想打印结果,您可以从调用者函数打印它。这样,该函数就足够通用,可以在其他上下文中使用。

此外,Python应用程序的建议缩进大小为4。虽然使用2个空格是有效的代码,但实际上它并没有在任何地方使用(但在一些知名公司的私有代码中-但这是他们的业务)。

您的固定代码,加上推荐-将在Python 2和Python 3中工作:

import sys

def wrapLines(line_length, words):
    curr_line = ""
    result = []
    for word in words:
        if len(curr_line) + len(word) + 1 >= line_length:
            result.append(curr_line)
            curr_line = ""
        else:
            curr_line += " " + word
    if curr_line:
        result.append(currline)
    return result


def main():
    first_line = None
    words = []

    first_arg = True
    for line in sys.stdin:
        if len(line.strip()) == 0:
            continue

        line = line.rstrip()

        if first_arg:
            line_length = int(line)
            first_arg = False
        else:
            words.append(line)

    print("\n".join(wrapLines(line_length, words)))


main()

 类似资料:
  • 问题内容: 我在正常( 非ajax )函数中遇到了问题,每个函数中都包含许多 动画 。目前,我只是具有一个between函数,但这并不是完美的,因为没有浏览器/计算机是相同的。 附加说明:它们都有碰撞的单独动画/等。 我不能简单地将一个放在另一个的回调函数中 无论如何在js / jQuery中有: 我知道&,但是这些是针对AJAX的… 我更新的解决方案 jQuery有一个名为$ .timers的暴

  • 本文向大家介绍Python 处理带有 \u 的字符串操作,包括了Python 处理带有 \u 的字符串操作的使用技巧和注意事项,需要的朋友参考一下 最近遇到一个头疼的问题,用socket接收到一个字符串 格式如下: {“trade_status”: {“desc”: “\u30106\u3011 - \u8d22\u52a1\u7ed3\u7b97\u5df2\u5b8c\u6210 “}}/en

  • 主要内容:文章目录,1.用户登录权限效验,2.统一异常处理,3.统一数据返回格式统⼀⽤户登录权限验证 统⼀数据格式返回 统⼀异常处理 1.用户登录权限效验 1.1 最初的用户登录验证 每个⽅法中都要单独写⽤户登录验证的⽅法,即使封装成公共⽅法,也⼀样要传参调⽤和在⽅法中进⾏判断。 添加控制器越多,调⽤⽤户登录验证的⽅法也越多,这样就增加了后期的修改成本和维护成本。 1.2 Spring AOP 用户统一登录验证的问题 没办法获取到 HttpSession 对象。 要对⼀部分⽅

  • 问题内容: 我需要在JavaScript / jQuery中执行几个功能,但我想避免阻塞UI。 AJAX不是一个可行的解决方案,由于应用程序的性质,这些功能很容易达到数千种。异步执行此操作将终止浏览器。 因此,我需要某种方式链接浏览器需要处理的功能,并且仅在第一个功能完成后才发送下一个功能。 该算法是这样的 适用于2到15步 HTTP:获取当前步骤的项目数量(范围从几百到几千) 对于每个项目,HT

  • 本文向大家介绍使用python对excel表格处理的一些小功能,包括了使用python对excel表格处理的一些小功能的使用技巧和注意事项,需要的朋友参考一下 python对excel表格处理的一些小功能 功能概览pandas库的一些应用文件读入计算表格中每一行的英文单词数简单用textblob进行自然语言情感分析判断一行中是不是有两列值都与其他行重复(可推广至多列)对表格中的两列自定义函数运算判

  • 我正在使用Maven SureFire,TestNG(扩展AbstractTestNGCucumber测试)和Cucumber,并且有几个功能文件,每个文件都有几个场景。我希望能够在一个功能文件中并行运行每个场景,但一次只能运行一个功能文件。这有可能吗? 举个例子: 我希望场景1a、1b和1c在功能文件1中并行运行。一旦这些完成,运行场景2a和功能2等的2b。 这是当前一次从所有功能文件运行所有方