按最小大小分割字符串

4 投票
4 回答
3784 浏览
提问于 2025-04-18 08:56

我正在写一个Python脚本,这个脚本可以接受用点号分隔的版本号。它会把这个字符串分割成单独的部分(用点号.作为分隔符)。我的脚本支持最多4个部分(比如1.2.3.4)。不过,用户可能会输入少于或多于4个部分,我的脚本需要能够处理这些情况。

如果输入的部分少于4个,我从string.split()得到的列表需要调整为4个元素,缺失的部分用字符串"0"来填充。如果输入的部分超过4个,就只保留前4个部分,后面的直接去掉。

去掉多余部分很简单,我只需要切割列表就可以了。但是,我不太确定怎么把列表调整到4个元素。有没有什么Python的好方法来做到这一点,还是说我需要自己写很多逻辑来实现?

我使用的是Python 3.2。

4 个回答

-1

如果你的列表叫做 a,而你想把它扩展到4个元素

 a = a + [0]*(4-len(a))

这段代码可以帮你实现你想要的扩展。

这个方法之所以有效,是因为对于任何列表 l,使用 l * x 会生成一个新列表,其中 l 的元素会重复 x 次。所以 [0]*4 就是生成一个包含四个零的列表 [0,0,0,0]。而 len(a) 是你当前列表的长度,所以 4-len(a) 就是你需要额外添加的元素数量。

1

在编程中,有时候我们需要让程序在特定的条件下执行某些操作。这就像给程序设定了一些规则,只有当这些规则被满足时,程序才会继续进行。

比如说,你可能希望程序在用户输入正确的密码后,才允许他们访问某个页面。这种情况下,你就需要用到条件判断。条件判断就像是在问一个问题,如果答案是“是”,那么就执行某个操作;如果答案是“否”,那么就执行另一个操作。

在代码中,条件判断通常用“if”语句来实现。你可以把“if”想象成一个门,只有当条件满足时,这扇门才会打开,让程序继续往下走。

总之,条件判断是编程中非常重要的一部分,它帮助我们控制程序的执行流程,让程序能够根据不同的情况做出不同的反应。

>>> (['0'] * 4 + "4.5".split('.'))[-4:]
['0', '0', '4', '5']
>>> (['0'] * 4 + "4.5".split('.'))[-4:]
['0', '0', '4', '5']
>>> (['0'] * 4 + "2.4.5".split('.'))[-4:]
['0', '2', '4', '5']
>>> (['0'] * 4 + "1.2.4.5".split('.'))[-4:]
['1', '2', '4', '5']
2

这样就能解决问题了

def GetVersionList( version_string ):
    vlist = version_string.split('.')[:4]
    vlist.extend('0' * (4 - len(vlist) ) )
    return vlist

或者可以用一个更通用的版本

def FixedLengthListFromString( input, length, delimiter='.', padChar='0' ):
    vlist = input.split(delimiter)[:length]
    vlist.extend(padChar * (length - len(vlist) ) )
    return vlist
3

你可以先检查一下列表的长度,然后把缺少的部分加到开头:

def pad_list(input_string, pad_length, pad_char='0'):
    base_version = input_string.split('.')[:pad_length]
    missing_entries = [pad_char] * pad_length - len(base_version)
    return base_version + missing_entries

这里唯一需要补充的就是,实际上要检查一下你得到的部分列表的长度,然后创建一个和缺失部分长度相同的新列表。

另外,你也可以提前加上0,以防列表太短:

(a + '.' + '.'.join(['0'] * 4)).split('.')[:4]

这里第二行的意思是提前在你的版本字符串里加上零,这样就能有效解决填充的问题。

首先,我们在字符串 a 的末尾加上 '.' + '.'.join(['0']*4),这会在末尾添加 .0.0.0.0,这样就算字符串的其他部分不够,填充也已经到位了。

填充完成后,你就可以像往常一样进行切片操作:.split('.')[:4]

撰写回答