2012-12-02 192 views
23

有没有办法取一个长度为4*x的字符串,并将其切割成4个字符串,每个字符长度为x,而不知道字符串的长度?将字符串按长度拆分为字符串?

例如:

>>>x = "qwertyui" 
>>>split(x, one, two, three, four) 
>>>two 
'er' 
+3

你就不能索要字符串的长度与' LEN(X)'? – Eric

+0

Eric:那你怎么能用这个? – tkbx

+0

切片符号? –

回答

53
>>> x = "qwertyui" 
>>> chunks, chunk_size = len(x), len(x)/4 
>>> [ x[i:i+chunk_size] for i in range(0, chunks, chunk_size) ] 
['qw', 'er', 'ty', 'ui'] 
+0

设置“块”的价值是什么?它始终是'len(x)' – Nitay

10

我试着回答亚历山大,但得到这个错误在Python3:

TypeError: 'float' object cannot be interpreted as an integer 

这是因为在Python3除法运算符返回一个浮点数。这个工作对我来说:

>>> x = "qwertyui" 
>>> chunks, chunk_size = len(x), len(x)//4 
>>> [ x[i:i+chunk_size] for i in range(0, chunks, chunk_size) ] 
['qw', 'er', 'ty', 'ui'] 

通知的//第2行的目的,确保截断为整数。

+1

您可能正在使用Python3,其中除法运算符返回一个浮点数。您可以使用截断除法运算符'// //而不是将其转换为整数:'len(x)// 4'。另外,我认为'int(len(x))'中的转换是不必要的。 – BoppreH

+0

谢谢,我已经更新了答案。 – BoppreH

3

这里是一个班轮这并不需要知道字符串的长度事先:

from functools import partial 
from StringIO import StringIO 

[l for l in iter(partial(StringIO(data).read, 4), '')] 

如果你有一个文件或插座,那么你不需要StringIO的包装:

[l for l in iter(partial(file_like_object.read, 4), '')] 
+0

如果您正在使用python3,则StringIO现在位于io模块中。 –

0

而对于谁喜欢它有点更具可读性帅哥:

def itersplit_into_x_chunks(string,x=10): # we assume here that x is an int and > 0 
    size = len(string) 
    chunksize = size//x 
    for pos in range(0, size, chunksize): 
     yield string[pos:pos+chunksize] 

输出:

>>> list(itersplit_into_x_chunks('qwertyui',x=4)) 
['qw', 'er', 'ty', 'ui'] 
-2

我的解决方案

st =' abs de fdgh 1234 556 shg shshh' 
    print st 

    def splitStringMax(si, limit): 
    ls = si.split() 
    lo=[] 
    st='' 
    ln=len(ls) 
    if ln==1: 
     return [si] 
    i=0 
    for l in ls: 
     st+=l 
     i+=1 
     if i <ln: 
      lk=len(ls[i]) 
      if (len(st))+1+lk < limit: 
       st+=' ' 
       continue 
     lo.append(st);st='' 
    return lo 

    ############################ 

    print splitStringMax(st,7) 
    # ['abs de', 'fdgh', '1234', '556', 'shg', 'shshh'] 
    print splitStringMax(st,12) 

    # ['abs de fdgh', '1234 556', 'shg shshh'] 
3
def split2len(s, n): 
    def _f(s, n): 
     while s: 
      yield s[:n] 
      s = s[n:] 
    return list(_f(s, n)) 
+3

你能解释你的答案吗? – Zulu

+0

真棒,谢谢 – HCLivess

1

这里有两个通用的方法。可能值得添加到您自己的可重复使用库中。第一个需要项目是可分片的,第二个需要与任何迭代器一起工作(但要求他们的构造函数接受迭代)。

def split_bylen(item, maxlen): 
    ''' 
    Requires item to be sliceable (with __getitem__ defined) 
    ''' 
    return [item[ind:ind+maxlen] for ind in range(0, len(item), maxlen)] 
    #You could also replace outer [ ] brackets with () to use as generator. 

def split_bylen_any(item, maxlen, constructor=None): 
    ''' 
    Works with any iterables. 
    Requires item's constructor to accept iterable or alternatively 
    constructor argument could be provided (otherwise use item's class) 
    ''' 
    if constructor is None: constructor = item.__class__ 
    return [constructor(part) for part in zip(* ([iter(item)] * maxlen))] 
    #OR: return map(constructor, zip(* ([iter(item)] * maxlen))) 
    # which would be faster if you need an iterable, not list 

所以,在topicstarter的情况下,用法是:需要在很多情况下,像在那里你必须给出的字符串的字符排序

string = 'Baboons love bananas' 
parts = 5 
splitlen = -(-len(string) // parts) # is alternative to math.ceil(len/parts) 

first_method = split_bylen(string, splitlen) 
#Result :['Babo', 'ons ', 'love', ' ban', 'anas'] 

second_method = split_bylen_any(string, splitlen, constructor=''.join) 
#Result :['Babo', 'ons ', 'love', ' ban', 'anas'] 
0

字符串分割,用替换字符另一个字符等等。但是所有这些操作都可以用下面提到的字符串分割方法来执行。

字符串分割可以通过两种方式来完成:

  1. 切片基于分裂的长度给定的字符串。

  2. 将给定的字符串转换为具有list(str)函数的列表,其中字符串的字符分解以形成列表的元素。然后执行所需的操作并将它们与'原始字符串'的字符之间的指定字符'加入(列表)以获得新的处理过的字符串。

-1
l = 'abcdefghijklmn' 

def group(l,n): 
    tmp = len(l)%n 
    zipped = zip(*[iter(l)]*n) 
    return zipped if tmp == 0 else zipped+[tuple(l[-tmp:])] 

print group(l,3) 
+1

尽管这段代码可能会解决这个问题,[包括解释](// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)确实有助于提高您的质量帖子。请记住,您将来会为读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性注释来挤占代码,这会降低代码和解释的可读性! – kayess

1

有一个re招:

In [28]: import re 

In [29]: x = "qwertyui" 

In [30]: [x for x in re.split(r'(\w{2})', x) if x] 
Out[30]: ['qw', 'er', 'ty', 'ui'] 

然后是FUNC,它可能是这样的:

def split(string, split_len): 
    # Regex: `r'.{1}'` for example works for all characters 
    regex = r'(.{%s})' % split_len 
    return [x for x in re.split(regex, string) if x] 
2
  • :PARAM S:STR;源字符串
  • :param w:int;宽度分割上

使用textwrap模块:

PyDocs-textwrap

import textwrap 
def wrap(s, w): 
    return textwrap.fill(s, w) 

:返回STR:

灵感来自Alexander's Answer

PyDocs-data structures

def wrap(s, w): 
    return [s[i:i + w] for i in range(0, len(s), w)] 
  • :退货单:

Inspired by Eric's answer

PyDocs-regex

import re 
def wrap(s, w):  
    sre = re.compile(rf'(.{{{w}}})') 
    return [x for x in re.split(sre, s) if x] 
  • :退货单:

Complete Code Examples/Alternative Methods

1
length = 4 
string = "abcdefgh" 
str_dict = [ o for o in string ] 
parts = [ ''.join(str_dict[ (j * length) : ((j + 1) * length) ] ) for j in xrange(len(string)/length )] 
+0

嗨Frederico,欢迎来到SO!解释为什么你在这个答案中做了你所做的事情可能是值得的,这样你显示的语言和想法的新手就能理解为什么这是一个好的行动方案。 –

0
some_string="ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
x=3 
res=[some_string[y-x:y] for y in range(x, len(some_string)+x,x)] 
print(res) 

会产生

['ABC', 'DEF', 'GHI', 'JKL', 'MNO', 'PQR', 'STU', 'VWX', 'YZ'] 
相关问题