将字符串分割为固定数量的令牌列表的简洁方法

1 投票
7 回答
996 浏览
提问于 2025-04-17 21:41

我正在写一段代码,需要把一个用连字符分隔的字符串分成最多三个部分。如果分出来的部分少于三个,就要补充足够的空字符串,以确保总共有三个部分。

举个例子,'foo-bar-baz' 应该被分成 ['foo', 'bar', 'baz'],但是 'foo-bar' 应该被分成 ['foo', 'bar', '']

这是我写的代码。

def three_tokens(s):
    tokens = s.split('-', 2)
    if len(tokens) == 1:
        tokens.append('')
        tokens.append('')
    elif len(tokens) == 2:
        tokens.append('')
    return tokens

print(three_tokens(''))
print(three_tokens('foo'))
print(three_tokens('foo-bar'))
print(three_tokens('foo-bar-baz'))
print(three_tokens('foo-bar-baz-qux'))

这是输出结果:

['', '', '']
['foo', '', '']
['foo', 'bar', '']
['foo', 'bar', 'baz']
['foo', 'bar', 'baz-qux']

我想问的是,我写的 three_tokens 函数似乎对于这个小任务来说有点啰嗦。有没有更简洁的写法,或者有没有专门用于这种任务的 Python 函数或类,可以让代码更简洁呢?

7 个回答

0

使用 str.partition 方法:

def three_tokens(s):
    t1, unused, t2 = s.partition('-')
    t2, unused, t3 = t2.partition('-')
    return [t1, t2, t3]
0

这可能有效。

tokens = s.split('-', 2)
tokens += [''] * max(0, 3 - len(tokens))
0

这个怎么样?

def three_tokens(s):
    output = ['', '', '']
    tokens = s.split('-', 2)
    output[0:len(tokens)] = tokens
    return output

再来一个一行代码:

three_tokens = lambda s: (s.split('-', 2) + ['', ''])[:3]

顺便说一下,我觉得你的解决方案没有什么不符合Python风格的地方。虽然有点啰嗦,但意图非常明确。

再来一个:

def three_tokens(s):
   it = iter(s.split('-', 2))
   return [ next(it, '') for _ in range(3) ]
1

这可能有点多余,但你可以使用一些来自 itertools 的方法。

list(itertools.islice(itertools.chain(s.split('-', 2), itertools.repeat('')), 3)
2

你可以使用一个简单的 while 循环:

def three_tokens(s):
    tokens = s.split('-', 2)
    while len(tokens) < 3:
        tokens.append('')
    return tokens

或者用计算出来的空字符串数量来扩展列表:

def three_tokens(s):
    tokens = s.split('-', 2)
    tokens.extend([''] * (3 - len(tokens)))
    return tokens

或者使用连接的方法,这样你就可以把它放在返回语句里:

def three_tokens(s):
    tokens = s.split('-', 2)
    return tokens + [''] * (3 - len(tokens))

撰写回答