我有一个由字母和数字组成的字符串,我想要一个按两个分组的列表,即我有:
shv = "abcdef"
我想要:
('ab'; 'cd', 'ef')
我能做到:
thv = (shv[0:2], shv[2:4], shv[4:6])
但不知怎的,这看起来有点不通用:有没有更好的方法,即对于任何一方的字符串和另一个分组值(例如,由n个字母组组成)
答案 0 :(得分:5)
您可以使用列表推导并使用range
的step
参数:
[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])]