2009-10-25 39 views

回答

28

这里的另一种解决方案:

span = 2 
words = "this-is-a-string".split("-") 
print ["-".join(words[i:i+span]) for i in range(0, len(words), span)] 
+0

谢谢,尼克D. – Gumbo

+0

为什么投了票?这个答案有什么问题? – Gumbo

+0

这似乎是分离之间变长的最简单方法。 – Gnuffo1

0
l = 'this-is-a-string'.split() 
nl = [] 
ss = "" 
c = 0 
for s in l: 
    c += 1 
    if c%2 == 0: 
     ss = s 
    else: 
     ss = "%s-%s"%(ss,s) 
     nl.insert(ss) 

print nl 
+0

什么是N +由于未定义名称,因此出现名称错误。 – Gnuffo1

+0

对不起,我第一次误读了你的问题并且改写了它,n是以前的剩余物。现在它给出了一个字符串列表。 – SpliFF

+0

与此处提出的许多其他解决方案相比,这是非常复杂的(长时间阅读/解密)。 – EOL

0

编辑:原代码我张贴不工作。这个版本确实如此:

我不认为你可以分裂每一个,但你可以分裂每一个 - 并加入每一对。

chunks = [] 
content = "this-is-a-string" 
split_string = content.split('-') 

for i in range(0, len(split_string) - 1,2) : 
    if i < len(split_string) - 1: 
     chunks.append("-".join([split_string[i], split_string[i+1]])) 
    else: 
     chunks.append(split_string[i]) 
+0

这是行不通的,我得到'[“ - ”,“ - ”,“ - ”,“ - ”]' –

+0

这不起作用。输出包含一个包含连字符的1个字符串列表。 – recursive

+0

@Jed他的想法很好,你可以自己写实现。 – 2009-10-25 20:22:45

9

正则表达式处理这个问题很容易:

import re 
s = "aaaa-aa-bbbb-bb-c-ccccc-d-ddddd" 
print re.findall("[^-]+-[^-]+", s) 

输出:

['aaaa-aa', 'bbbb-bb', 'c-ccccc', 'd-ddddd'] 

更新尼克d:

n = 3 
print re.findall("-".join(["[^-]+"] * n), s) 

输出:

['aaaa-aa-bbbb', 'bb-c-ccccc'] 
+1

可能是最优雅的解决方案,它仍然可读,其余的正在伸展它。 –

+1

很好的答案,但它只适用于每个第二个分隔符。 –

+0

...只适用于偶数个单词。 – Gumbo

16
>>> s="a-b-c-d-e-f-g-h-i-j-k-l"   # use zip(*[i]*n) 
>>> i=iter(s.split('-'))    # for the nth case  
>>> map("-".join,zip(i,i))  
['a-b', 'c-d', 'e-f', 'g-h', 'i-j', 'k-l'] 

>>> i=iter(s.split('-')) 
>>> map("-".join,zip(*[i]*3)) 
['a-b-c', 'd-e-f', 'g-h-i', 'j-k-l'] 
>>> i=iter(s.split('-')) 
>>> map("-".join,zip(*[i]*4)) 
['a-b-c-d', 'e-f-g-h', 'i-j-k-l'] 

有时itertools.izip更快,你可以在结果

>>> from itertools import izip 
>>> s="a-b-c-d-e-f-g-h-i-j-k-l" 
>>> i=iter(s.split("-")) 
>>> ["-".join(x) for x in izip(i,i)] 
['a-b', 'c-d', 'e-f', 'g-h', 'i-j', 'k-l'] 

这里看到的是一个版本,排序作品与奇数个部分取决于您在这种情况下需要的输出。例如,您可能希望将最后一个元素末尾的'-'修剪为.rstrip('-')

>>> from itertools import izip_longest 
>>> s="a-b-c-d-e-f-g-h-i-j-k-l-m" 
>>> i=iter(s.split('-')) 
>>> map("-".join,izip_longest(i,i,fillvalue="")) 
['a-b', 'c-d', 'e-f', 'g-h', 'i-j', 'k-l', 'm-'] 

这里有一些计时

$ python -m timeit -s 'import re;r=re.compile("[^-]+-[^-]+");s="a-b-c-d-e-f-g-h-i-j-k-l"' 'r.findall(s)' 
100000 loops, best of 3: 4.31 usec per loop 

$ python -m timeit -s 'from itertools import izip;s="a-b-c-d-e-f-g-h-i-j-k-l"' 'i=iter(s.split("-"));["-".join(x) for x in izip(i,i)]' 
100000 loops, best of 3: 5.41 usec per loop 

$ python -m timeit -s 's="a-b-c-d-e-f-g-h-i-j-k-l"' 'i=iter(s.split("-"));["-".join(x) for x in zip(i,i)]' 
100000 loops, best of 3: 7.3 usec per loop 

$ python -m timeit -s 's="a-b-c-d-e-f-g-h-i-j-k-l"' 't=s.split("-");["-".join(t[i:i+2]) for i in range(0, len(t), 2)]' 
100000 loops, best of 3: 7.49 usec per loop 

$ python -m timeit -s 's="a-b-c-d-e-f-g-h-i-j-k-l"' '["-".join([x,y]) for x,y in zip(s.split("-")[::2], s.split("-")[1::2])]' 
100000 loops, best of 3: 9.51 usec per loop 
+1

+1 Nice,clean解决方案... – ChristopheD

+0

哇,太棒了! – unutbu

+0

pythonic优雅 – elzapp

0

我觉得几个已经给出解决方案都不够好,但只是为了好玩,我做了这个版本:

def twosplit(s,sep): 
    first=s.find(sep) 
    if first>=0: 
    second=s.find(sep,first+1) 
     if second>=0: 
     return [s[0:second]] + twosplit(s[second+1:],sep) 
     else: 
     return [s] 
    else: 
     return [s] 
    print twosplit("this-is-a-string","-") 
相关问题