¿Qué sentido tiene '/segment/segment/'.split('/')
volver ['', 'segment', 'segment', '']
?
Observe los elementos vacíos. Si está dividiendo en un delimitador que está en la posición uno y al final de una cadena, ¿qué valor adicional le da que la cadena vacía se devuelva desde cada extremo?
strip()
para quitar los caracteres divididos'/segment/segment/'.strip('/').split('/')
Respuestas:
str.split
complementosstr.join
, entonceste devuelve la cadena original.
Si las cadenas vacías no estuvieran allí, la primera y la última
'/'
faltarían después de lajoin()
fuente
De manera más general, para eliminar las cadenas vacías devueltas en los
split()
resultados, es posible que desee consultar lafilter
función.Ejemplo:
devoluciones
fuente
list(...)
.Hay dos puntos principales a considerar aquí:
'/segment/segment/'.split('/')
sea igual a['segment', 'segment']
es razonable, pero luego se pierde información. Sisplit()
funcionó como querías, si te digo esoa.split('/') == ['segment', 'segment']
, no puedes decirme quéa
fue.'a//b'.split()
ser?['a', 'b']
?, o['a', '', 'b']
? Es decir, ¿deberíansplit()
fusionarse los delimitadores adyacentes? Si fuera así, será muy difícil analizar los datos delimitados por un carácter y algunos de los campos pueden estar vacíos. Estoy bastante seguro de que hay muchas personas que hacen que los valores vacíos en el resultado para el caso anterior!Al final, se reduce a dos cosas:
Consistencia: si tengo
n
delimitadores, ena
, obtengon+1
valores después desplit()
.Debería ser posible hacer cosas complejas y fácil de hacer cosas simples: si desea ignorar las cadenas vacías como resultado del
split()
, siempre puede hacer:pero si uno no quiere ignorar los valores vacíos, debería poder hacerlo.
El lenguaje tiene que elegir una definición de
split()
: hay demasiados casos de uso diferentes para satisfacer los requisitos de todos de forma predeterminada. Creo que la elección de Python es buena y es la más lógica. (Aparte, una de las razones por las que no me gustan las Cstrtok()
es porque fusiona delimitadores adyacentes, lo que hace que sea extremadamente difícil realizar un análisis / tokenización seria con ellas).Hay una excepción:
a.split()
sin un argumento se exprime el espacio en blanco consecutivo, pero se puede argumentar que esto es lo correcto en ese caso. Si no desea el comportamiento, siempre puede hacerloa.split(' ')
.fuente
python3 -m timeit "import re ; re.sub(' +', ' foo bar baz ', '').split(' ')"
-> 875 nseg por ciclo;python3 -m timeit "[token for token in ' foo bar baz '.split(' ') if token]"
-> 616 nsec por bucleTener
x.split(y)
siempre devolver una lista de1 + x.count(y)
elementos es una regularidad preciosa - como @ gnibbler ya ha señalado, hacesplit
yjoin
exactamente inversas entre sí (como obviamente deberían ser), también mapea con precisión la semántica de todo tipo de registros unidos por delimitadores ( comocsv
líneas de archivo [[netos de problemas de citas]], líneas de/etc/group
Unix, etc.), permite (como se menciona en la respuesta de @ Roman) comprobaciones sencillas de (por ejemplo) rutas absolutas frente a relativas (en rutas de archivos y URL), Etcétera.Otra forma de verlo es que no debe tirar información por la ventana sin obtener ganancias. ¿Qué se ganaría al hacer
x.split(y)
equivalente ax.strip(y).split(y)
? Nada, por supuesto - es fácil de usar la segunda forma, cuando eso es lo que quieres decir, pero si la primera forma fue considerada arbitraria en el sentido de la segunda, que tendrían mucho trabajo que hacer cuando no desea que el primero de ellos ( lo cual está lejos de ser raro, como señala el párrafo anterior).Pero realmente, pensar en términos de regularidad matemática es la forma más simple y general en la que puede aprender a diseñar API aceptables. Para tomar un ejemplo diferente, es muy importante que para cualquier valor válido
x
yy
x == x[:y] + x[y:]
- que indica inmediatamente por qué se debe excluir un extremo de un corte . Cuanto más simple sea la afirmación invariante que pueda formular, más probable es que la semántica resultante sea lo que necesita en los usos de la vida real, parte del hecho místico de que las matemáticas son muy útiles para tratar con el universo.Intente formular el invariante para un
split
dialecto en el que los delimitadores iniciales y finales están en mayúsculas especiales ... contraejemplo: métodos de cadena comoisspace
no son extremadamente simples,x.isspace()
es equivalente ax and all(c in string.whitespace for c in x)
, esa entrada tontax and
es la razón por la que tan a menudo se encuentra codificandonot x or x.isspace()
, para volver a la simplicidad que debería haber sido diseñada en losis...
métodos de cadena (donde una cadena vacía "es" cualquier cosa que desee, al contrario del sentido del caballo del hombre en la calle, tal vez [[conjuntos vacíos, como cero & c, siempre ha confundido a la mayoría de la gente ;-)]], ¡pero se ajusta completamente al sentido común matemático obvio y refinado ! -).fuente
¿No estoy seguro de qué tipo de respuesta estás buscando? Obtienes tres coincidencias porque tienes tres delimitadores. Si no quieres ese vacío, solo usa:
fuente
Bueno, te permite saber que había un delimitador allí. Entonces, ver 4 resultados le permite saber que tenía 3 delimitadores. Esto le da el poder de hacer lo que quiera con esta información, en lugar de que Python elimine los elementos vacíos y luego haga que usted verifique manualmente los delimitadores de inicio o finalización si necesita saberlo.
Ejemplo simple: digamos que desea verificar los nombres de archivo absolutos frente a los relativos. De esta manera, puede hacerlo todo con la división, sin tener que verificar también cuál es el primer carácter de su nombre de archivo.
fuente
Considere este ejemplo mínimo:
split
debe darle lo que está antes y después del delimitador'/'
, pero no hay otros caracteres. Entonces tiene que darle la cadena vacía, que técnicamente precede y sigue a'/'
, porque'' + '/' + '' == '/'
.fuente