返回按两个分组的字符串字母列表

时间:2014-02-11 21:48:50

标签: python

我有一个由字母和数字组成的字符串,我想要一个按两个分组的列表,即我有:

shv = "abcdef"

我想要:

('ab'; 'cd', 'ef')

我能做到:

thv  = (shv[0:2], shv[2:4], shv[4:6]) 

但不知怎的,这看起来有点不通用:有没有更好的方法,即对于任何一方的字符串和另一个分组值(例如,由n个字母组组成)

6 个答案:

答案 0 :(得分:5)

您可以使用列表推导并使用rangestep参数:

[shv[i:i+2] for i in range(0, len(shv)-1, 2)]

对于任意n

def my_awesome_grouping_function(shv, n):
    return [shv[i:i+n] for i in range(0, len(shv)-(n-1), n)]

演示:

>>> shv="abcdef"
>>> [shv[i:i+2] for i in range(0, len(shv)-1, 2)]
['ab', 'cd', 'ef']
>>> [shv[i:i+3] for i in range(0, len(shv)-2, 3)]
['abc', 'def']

我修剪了上限,因为我认为你不会想要任何尾随的不完整对。你呢?如果您转到len(shv),我相信您会在最后一个元素中获得剩余的len(shv) % n个字母。

>>> shv="abcdefgh"
>>> [shv[i:i+3] for i in range(0, len(shv), 3)]
['abc', 'def', 'gh']
>>> [shv[i:i+3] for i in range(0, len(shv)-1, 3)]
['abc', 'def', 'gh']
>>> [shv[i:i+3] for i in range(0, len(shv)-2, 3)]
['abc', 'def']

(如上所示,修剪工作必须为len(shv)-(n-1)。)

答案 1 :(得分:4)

为此我会选择textwrap,给出一个优雅的解决方案:

>>> import textwrap
>>>
>>> shv = "abcdef"
>>> thv = textwrap.wrap(shv, 2)
>>> thv
['ab', 'cd', 'ef']

如果你的尺码不匹配,这就是你得到的:

>>> thv = textwrap.wrap(shv, 4)
>>> thb
['abcd', 'ef']

如果您只想包含“完整”子字符串,可以使用以下理解:

>>> thv = [substr for substr in textwrap.wrap(shv, 4) if len(substr) == 4]
>>> thv
['abcd']

答案 2 :(得分:2)

怎么样

>>> import re
>>> re.findall("..", shv)
['ab', 'cd', 'ef']

对于任意长度(例如3),请使用{n}量词:

>>> shv = "abcdefghi"
>>> re.findall(".{3}", shv)
['abc', 'def', 'ghi']

如果您想要使用完全不匹配的剩余字母,请使用{1,n}

>>> shv = "abcdefghijk"
>>> re.findall(".{1,3}", shv)
['abc', 'def', 'ghi', 'jk']

答案 3 :(得分:2)

复制迭代器的好小技巧。

tuple(''.join(i) for i in zip(*[iter(shv)]*2))

替代版本,如果你对这个悲伤的孤独角色感到多愁善感,被遗忘在一个奇怪长度的字符串的末尾。

from itertools import izip_longest
tuple(''.join(i) for i in izip_longest(*[iter(shv)]*2, fillvalue=''))

答案 4 :(得分:1)

这是一种使用正则表达式的方法。

import re

shv = "abcdef"
print re.findall('..',shv)

答案 5 :(得分:0)

shv = "abcdef"
[''.join(item) for item in zip(shv[0::2],shv[1::2])]