我正在编写一段代码,需要将连字符分隔的字符串拆分为最多三个令牌。如果分割后少于三个标记,它应该附加足够数量的空字符串以制作三个标记。
例如,'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
函数似乎对这个小任务来说太冗长了。是否有一种Pythonic方式来编写它,或者是否有一些Python函数或类特别用于执行这种使代码更简洁的任务?
答案 0 :(得分: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
或使用连接,以便将它放在return语句中:
def three_tokens(s):
tokens = s.split('-', 2)
return tokens + [''] * (3 - len(tokens))
答案 1 :(得分:2)
这可能有点矫枉过正,但您可以使用itertools
中的一些方法。
list(itertools.islice(itertools.chain(s.split('-', 2), itertools.repeat('')), 3)
答案 2 :(得分:0)
def three_tokens(s):
t1, unused, t2 = s.partition('-')
t2, unused, t3 = t2.partition('-')
return [t1, t2, t3]
答案 3 :(得分:0)
这可行。
tokens = s.split('-', 2)
tokens += [''] * max(0, 3 - len(tokens))
答案 4 :(得分:0)
>>> n = 3
>>> a = '123-abc'
>>> b = a.split('-', n)
>>> if len(b) < n-1:
... b = b + ['']*(n-len(b))
...
>>> b
['123', 'abc', '']
>>>
答案 5 :(得分:0)
def three_tokens(s):
tokens = s.split('-', 2)
return [tokens.pop(0) if len(tokens) else '' for _ in range(0, 3)]
...产量
>>> three_tokens('foo')
['foo', '', '']
>>> three_tokens('foo-bar')
['foo', 'bar', '']
>>> three_tokens('foo-bar-baz')
['foo', 'bar', 'baz']
>>> three_tokens('foo-bar-baz-buzz')
['foo', 'bar', 'baz-buzz']
答案 6 :(得分:0)
这个怎么样?
def three_tokens(s):
output = ['', '', '']
tokens = s.split('-', 2)
output[0:len(tokens)] = tokens
return output
还有一个oneliner:
three_tokens = lambda s: (s.split('-', 2) + ['', ''])[:3]
顺便说一下,我发现你的解决方案没有任何不同的东西。它有点冗长,但目的很明确。
还有一个:
def three_tokens(s):
it = iter(s.split('-', 2))
return [ next(it, '') for _ in range(3) ]