Python 从split()获取最少数量的元素
假设一个字符串包含(逗号)分隔的元素,例如一个版本字符串Python 从split()获取最少数量的元素,python,string,split,Python,String,Split,假设一个字符串包含(逗号)分隔的元素,例如一个版本字符串 version_str = "3,1,4,159" >>> version_parser = lambda s: "{},{},{},{},{}".format(*s.split(',') + ([""] * (5-len(s.split(','))))) 其中可能或多或少包含一个或多个元素: version_str = "3,1,4" 或 我想像这样分离这些元素: major, minor, patch, rev
version_str = "3,1,4,159"
>>> version_parser = lambda s: "{},{},{},{},{}".format(*s.split(',') + ([""] * (5-len(s.split(',')))))
其中可能或多或少包含一个或多个元素:
version_str = "3,1,4"
或
我想像这样分离这些元素:
major, minor, patch, revision, appendix = version_str.split(',')
version_str.split(',', min_elements=5)
当然,我会得到一个ValueError
,因为提取的元素数量并不总是匹配的
是否有方法扩展拆分()的结果,例如:
major, minor, patch, revision, appendix = version_str.split(',')
version_str.split(',', min_elements=5)
或
?
例如:
>>> '3,1,4'.split(',', min_elements=5)
['3', '1', '4', '', '']
>>> '3,1,4,159,dev'.split(',', min_elements=5)
['3', '1', '4', '159', 'dev']
当然,我可以在之后手动添加元素或有条件地读取元素,但我对pythonic one liner感兴趣。据我所知,没有现成的功能,但您可以编写自己的函数来实现这一点:
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
在一行中使用zip\u longest
:
from itertools import zip_longest
major, minor, patch, revision, appendix = [x + y for x, y in zip_longest(
version_str.split(','), [''] * 5, fillvalue='')]
或:
要访问各个字段,请执行以下操作:
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
我建议您编写一个小型内联(或普通)函数来解析版本字符串
version_str = "3,1,4,159"
>>> 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']
我不明白。拆分做得很好,并确保其位于try/catch部分,以便限制元素的数量。也许我不理解zip([major,minor,patch,revision,appendix],version_str.split(','))
或major,minor,patch,revision,appendix=version_str.split(',')[:5]
相关:我喜欢你的答案,因为它是一个真正的单行线,而且它表明似乎还没有直观的方法。