Cadena dividida con tamaño mínimo

Estoy escribiendo un script en python que aceptará un número de versión delimitado por puntos. Dividirá esta cadena en componentes individuales (utilizando el punto ( . ) Como un delimitador). Mi script admite hasta 4 componentes (por ejemplo, 1.2.3.4 ). Sin embargo, el usuario puede especificar menos o más componentes que 4 y mi script necesita poder manejarlo.

Si es menos de 4, la lista que obtengo de string.split() debe cambiarse de tamaño a 4 y los componentes faltantes deben inicializarse en la cadena "0" . Si es mayor que 4, simplemente trunca los elementos más allá del 4to componente.

El truncamiento es fácil, solo empalme la lista. Sin embargo, no estoy seguro de cómo realizar el cambio de tamaño hasta 4 elementos. ¿Hay una forma pythonica de hacer esto, o necesito escribir a mano un montón de lógica para hacerlo?

Estoy usando Python 3.2.

Por lo general, puede verificar la longitud de la lista y simplemente agregar la lista que falta al inicio:

 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 

Realmente, la única adición aquí es realmente verificar la longitud de la lista parcial que está recibiendo y luego crear otra lista con la misma longitud que la sección que falta.

Alternativamente, puede agregar los 0 antes de tiempo en caso de que sea demasiado corto:

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

La idea detrás de la segunda línea aquí es agregar ceros de forma preventiva a la cadena de su versión, lo que elimina efectivamente su problema de relleno.

Primero, agregamos '.' + '.'.join(['0']*4) '.' + '.'.join(['0']*4) al final de la cadena a , esto agrega .0.0.0.0 al final, lo que significa que efectivamente el relleno está allí independientemente de lo que haya en el rest de la cadena .

Después de que el relleno está allí, se corta como normalmente lo haría: .split('.')[:4]

Esto hace el truco

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

O una versión más general.

 def FixedLengthListFromString( input, length, delimiter='.', padChar='0' ): vlist = input.split(delimiter)[:length] vlist.extend(padChar * (length - len(vlist) ) ) return vlist 
 >>> (['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'] 

Si tu lista es y quieres rellenarla con 4 elementos

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

Hará el relleno que requieras.

Esto funciona porque con cualquier lista l , l * x creará una nueva lista con el elemento de l repetido x veces, por lo que [0]*4 es solo la lista [0,0,0,0] . Y len(a) es la longitud actual de su lista, de modo que 4-len(a) es el número de elementos adicionales necesarios.