将字符串分割为固定数量的令牌列表的简洁方法
我正在写一段代码,需要把一个用连字符分隔的字符串分成最多三个部分。如果分出来的部分少于三个,就要补充足够的空字符串,以确保总共有三个部分。
举个例子,'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))