将字符串拆分为固定数量的标记列表的简明方法

时间:2014-03-10 18:50:04

标签: python python-3.x

我正在编写一段代码,需要将连字符分隔的字符串拆分为最多三个令牌。如果分割后少于三个标记,它应该附加足够数量的空字符串以制作三个标记。

例如,'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函数或类特别用于执行这种使代码更简洁的任务?

7 个答案:

答案 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)

使用str.partition

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