从split()获取最少数量的元素

时间:2018-02-06 10:10:27

标签: python string split

想象一个包含(逗号)分隔元素的字符串,例如版本字符串

version_str = "3,1,4,159"

可能或多或少包含一个或多个元素:

version_str = "3,1,4"

version_str = "3,1,4,159,appendix"

我想将这些元素分开:

major, minor, patch, revision, appendix = version_str.split(',')

然后我当然得到ValueError,因为提取的元素数量并不总是匹配。

extend的{​​{1}}结果是否有办法,例如像这样:

split()

version_str.split(',', min_elements=5)

示例:

version_str.split(',').extend(5, default='')

当然我可以手动添加元素或有条件地读取元素,但我对pythonic单行感兴趣。

4 个答案:

答案 0 :(得分:2)

在一行中使用zip_longest

from itertools import zip_longest
major, minor, patch, revision, appendix = [x + y for x, y in zip_longest(
                                           version_str.split(','),  [''] * 5, fillvalue='')]

或:

split = version_str.split(',')
major, minor, patch, revision, appendix = split + [''] * (5 - len(split))

答案 1 :(得分:1)

据我所知,没有开箱即用的功能,但你可以编写自己的功能,为你解决问题:

def split_with_min(str, min_r, delimiter=',', default='NA'):
    temp = str.split(delimiter)
    return temp + [default] * (min_r - len(temp))


print(split_with_min('1,2', 5, ',', 'NA'))          # -> ['1', '2', 'NA', 'NA', 'NA']
print(split_with_min('1,2,3,4,5,6', 5, ',', 'NA'))  # -> ['1', '2', '3', '4', '5', '6']

现在对于单行要求,如果您不介意两次调用split(),则可以压缩上述内容:

a, b, c, d, e, f = my_str.split(',') + ['NA'] * (6 - len(my_str.split(',')))
print(f)  # -> 'NA'                              ^ number of variables we are defining

答案 2 :(得分:1)

version_str = "3,1,4,159,appendix"

version_str_1 = "3,1,4"

version_str_2 = "3,1,4,159"    

from collections import namedtuple

version = namedtuple("version", "major minor patch revision appendix")

version.__new__.__defaults__ = (None,) * len(version._fields)

print(version(*version_str_2.split(',')))
>>>version(major='3', minor='1', patch='4', revision='159', appendix=None)

print(version(*version_str_1.split(',')))
>>>version(major='3', minor='1', patch='4', revision=None, appendix=None)

print(version(*version_str.split(',')))
>>>version(major='3', minor='1', patch='4', revision='159', appendix='appendix')

访问各个字段:

get_version = version(*version_str_2.split(','))
get_version.major # '3'
get_version.minor # '1'
get_version.patch # '4'
get_version.revision # '159'
get_version.appendix # None

答案 3 :(得分:0)

我建议你写一个小内联(或普通)函数来解析版本字符串

>>> version_parser = lambda s: "{},{},{},{},{}".format(*s.split(',') + ([""] * (5-len(s.split(',')))))

然后像

一样调用它
>>> version_parser('3,1,4,159').split(',')
>>> ['3', '1', '4', '159', '']

>>> version_parser("3,1,4").split(',')
>>> ['3', '1', '4', '', '']

>>> version_parser("3,1,4,159,appendix").split(',')
>>> ['3', '1', '4', '159', 'appendix']