有没有一种方法可以拆分python字符串,而无需使用for循环,该循环基本上将中间的字符串拆分为最接近的定界符。
赞:
The cat jumped over the moon very quickly.
分隔符为空格,结果字符串为:
The cat jumped over
the moon very quickly.
我看到有一个count
,在那里我可以看到其中有多少空格(不过看不到如何返回它们的索引)。然后,我可以通过除以2找到中间的那个,但是然后如何在这个索引处用这个定界符说split。查找已关闭,但它返回的第一个索引(或使用rfind的第一个索引正确)不是所有找到“”的索引。我可能在考虑这个问题。
答案 0 :(得分:5)
这应该有效:
def split_text(text):
middle = len(text)//2
under = text.rfind(" ", 0, middle)
over = text.find(" ", middle)
if over > under and under != -1:
return (text[:,middle - under], text[middle - under,:])
else:
if over is -1:
raise ValueError("No separator found in text '{}'".format(text))
return (text[:,middle + over], text[middle + over,:])
它不使用for循环,但可能使用for循环会具有更好的性能。
我会通过引发错误来处理在整个字符串中找不到分隔符的情况,但是可以用任何处理该情况的方式更改
raise ValueError()
。
答案 1 :(得分:4)
您可以使用min
找到最靠近中间的空格,然后将字符串切成薄片。
s = "The cat jumped over the moon very quickly."
mid = min((i for i, c in enumerate(s) if c == ' '), key=lambda i: abs(i - len(s) // 2))
fst, snd = s[:mid], s[mid+1:]
print(fst)
print(snd)
The cat jumped over
the moon very quickly.
答案 2 :(得分:2)
我只是分开然后重新加入:
text = "The cat jumped over the moon very quickly"
words = text.split()
first_half = " ".join(words[:len(words)//2])
答案 3 :(得分:2)
我认为使用split的解决方案很好。我尝试不使用main()
来解决它,这就是我想出的。
split
这里的想法是:
答案 4 :(得分:1)
这样的事情怎么样:
s = "The cat jumped over the moon very quickly"
l = s.split()
s1 = ' '.join(l[:len(l)//2])
s2 = ' '.join(l[len(l)//2 :])
print(s1)
print(s2)
答案 5 :(得分:1)
如果您想得到一半的单词,而不是字符串的一半(计算字符而不是单词),则使用["A2A1", "A1A2", "A1B1", "B1A1", "B1C1", "C1B1", "D3E3", "E4E3", "E3D3", "E3E4"]
和split()
的解决方案就可以了。我认为后者是不可能的,没有join()
循环或列表理解(或昂贵的解决方法,例如递归来查找空间索引)。
但是,如果您对列表理解没什么问题,可以这样做:
for
在这里,我首先使用列表理解来查找分隔符的索引。然后,使用min()内置函数的自定义键,找到更接近分隔符的索引到字符串的一半。然后分裂。
phrase = "The cat jumped over the moon very quickly."
#indexes of separator, here the ' '
sep_idxs = [i for i, j in enumerate(phrase) if j == ' ']
#getting the separator index closer to half the length of the string
sep = min(sep_idxs, key=lambda x:abs(x-(len(phrase) // 2)))
first_half = phrase[:sep]
last_half = phrase[sep+1:]
print([first_half, last_half])
语句显示print
答案 6 :(得分:0)
正如瓦伦蒂诺(Valentino)所说,答案取决于您是否要平均分配字符数或平均分配字数:基于split()
的方法可以做到这一点。
这是一种无需循环或列表理解的方法。 delim
可以是任何单个字符。如果您想要更长的定界符,则此方法将不起作用,因为在这种情况下,它不必完全在上半部或整个下半部。
def middlesplit(s,delim=" "):
if delim not in s:
return (s,)
midpoint=(len(s)+1)//2
left=s[:midpoint].rfind(delim)
right=s[:midpoint-1:-1].rfind(delim)
if right>left:
return (s[:-right-1],s[-right:])
else:
return (s[:left],s[left+1:])
使用rfind()
而不是find()
的原因是,您可以选择较大的结果,如果字符串的仅一侧包含{{1 }}。