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

2024-09-29 23:17:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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

shv = "abcdef"

我想要:

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

我能做到:

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

但不知何故,这似乎有点不一般:有没有更好的方法,即对于任何一方的字符串和另一个分组值(例如按n个字母的组)


Tags: 方法字符串列表ab字母cd数字ef
3条回答

怎么样

>>> 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']

您可以使用列表理解并使用^{}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)才能进行修剪。)

对此,我同意textwrap,给出了一个优雅的解决方案:

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

如果您的尺寸不匹配,则会得到:

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

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

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

相关问题 更多 >

    热门问题