Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从split()获取最少数量的元素_Python_String_Split - Fatal编程技术网

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]
相关:我喜欢你的答案,因为它是一个真正的单行线,而且它表明似乎还没有直观的方法。