所以我需要程序的输出看起来像:
ababa
ab ba
xxxxxxxxxxxxxxxxxxx
that is it followed by a lot of spaces .
no dot at the end
The largest run of consecutive whitespace characters was 47.
但我得到的是:
ababa
ab ba
xxxxxxxxxxxxxxxxxxx
that is it followed by a lot of spaces .
no dot at the end
The longest run of consecutive whitespace characters was 47.
当我进一步研究我写的代码时,我发现print(c)
语句发生了这种情况:
['ababa', '', 'ab ba ', '', ' xxxxxxxxxxxxxxxxxxx', 'that is it followed by a lot of spaces .', ' no dot at the end']
在某些行之间,, '',
,这可能是我的打印声明无法工作的原因。
我该如何删除它们?我尝试使用不同的列表函数,但我不断收到语法错误。
这是我制作的代码:
a = '''ababa
ab ba
xxxxxxxxxxxxxxxxxxx
that is it followed by a lot of spaces .
no dot at the end'''
c = a.splitlines()
print(c)
#d = c.remove(" ") #this part doesnt work
#print(d)
for row in c:
print(' '.join(row.split()))
last_char = ""
current_seq_len = 0
max_seq_len = 0
for d in a:
if d == last_char:
current_seq_len += 1
if current_seq_len > max_seq_len:
max_seq_len = current_seq_len
else:
current_seq_len = 1
last_char = d
#this part just needs to count the whitespace
print("The longest run of consecutive whitespace characters was",str(max_seq_len)+".")
答案 0 :(得分:2)
据我所知,您最简单的解决方案是使用list comprehension:
c= [item for item in a.splitlines() if item != '']
如果您希望通过删除仅包含空格的字符串(例如' '
)来使其更加健壮,那么您可以按如下方式更改它:
c= [item for item in a.splitlines() if item.strip() != '']
然后您可以将列表重新加入,如下所示:
output = '\n'.join(c)
答案 1 :(得分:1)
使用内置的filter
函数可以轻松解决这个问题:
c = filter(None, a.splitlines())
# or, more explicit
c = filter(lambda x: x != "", a.splitlines())
第一个变体将创建一个列表,其中包含a.splitlines()
返回的列表中未评估为False
的列表中的所有元素,如空字符串。
第二个变体创建一个小的匿名函数(使用lambda
),它检查给定元素是否为空字符串,如果是这种情况则返回False
。这比第一个变体更明确。
另一种选择是使用list comprehension来实现同样的目标:
c = [string for string in a.splitlines if string]
# or, more explicit
c = [string for string in a.splitlines if string != ""]
答案 2 :(得分:1)
正则表达式时间:
import re
print(re.sub(r"([\n ])\1*", r"\1", a))
#>>> ababa
#>>> ab ba
#>>> xxxxxxxxxxxxxxxxxxx
#>>> that is it followed by a lot of spaces .
#>>> no dot at the end
re.sub(matcher, replacement, target_string)
匹配器是r"([\n ])\1*
,意思是:
([\n ]) → match either "\n" or " " and put it in a group (#1)
\1* → match whatever group #1 matched, 0 or more times
替换只是
\1 → group #1
您可以使用
获取最长的空白序列max(len(match.group()) for match in re.finditer(r"([\n ])\1*", a))
使用相同的匹配器,但只是得到它们的长度,然后max
它。