在定界符处拆分python字符串,但使用特定的字符串

时间:2019-01-21 23:01:41

标签: python

有没有一种方法可以拆分python字符串,而无需使用for循环,该循环基本上将中间的字符串拆分为最接近的定界符。

赞:

The cat jumped over the moon very quickly.

分隔符为空格,结果字符串为:

The cat jumped over
the moon very quickly.

我看到有一个count,在那里我可以看到其中有多少空格(不过看不到如何返回它们的索引)。然后,我可以通过除以2找到中间的那个,但是然后如何在这个索引处用这个定界符说split。查找已关闭,但它返回的第一个索引(或使用rfind的第一个索引正确)不是所有找到“”的索引。我可能在考虑这个问题。

7 个答案:

答案 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 }}。

相关问题