想象一个包含(逗号)分隔元素的字符串,例如版本字符串
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单行感兴趣。
答案 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']