我正在构建一个文字处理器,并尝试实现文字包装功能。
给定一行中的最大字符数,后跟一个单词列表,我想返回一个字符串集合,其中每行包含尽可能多的由空格连接的单词。每个字符串的长度不应超过最大长度。
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
首先,据我所知,您没有指定所需的线宽,因此我将根据您的预期输出假设
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','七个你好']
这里有几个问题-最重要的一个是,您正在读取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。 这是当前一次从所有功能文件运行所有方