Estoy usando split('\n')
para obtener líneas en una cadena, y descubrí que ''.split()
devuelve una lista vacía []
, mientras que ''.split('\n')
devuelve ['']
. ¿Hay alguna razón específica para tal diferencia?
¿Y hay alguna forma más conveniente de contar líneas en una cadena?
Respuestas:
El método str.split () tiene dos algoritmos. Si no se dan argumentos, se divide en ejecuciones repetidas de espacios en blanco. Sin embargo, si se proporciona un argumento, se trata como un delimitador único sin ejecuciones repetidas.
En el caso de dividir una cadena vacía, el primer modo (sin argumento) devolverá una lista vacía porque se come el espacio en blanco y no hay valores para poner en la lista de resultados.
Por el contrario, el segundo modo (con un argumento como
\n
) producirá el primer campo vacío. Considere que si hubiera escrito'\n'.split('\n')
, obtendría dos campos (uno dividido, le da dos mitades).Este primer modo es útil cuando los datos se alinean en columnas con cantidades variables de espacios en blanco. Por ejemplo:
El segundo modo es útil para datos delimitados, como CSV, donde las comas repetidas denotan campos vacíos. Por ejemplo:
Tenga en cuenta que el número de campos de resultado es uno mayor que el número de delimitadores. Piensa en cortar una cuerda. Si no haces cortes, tienes una sola pieza. Haciendo un corte, da dos piezas. Haciendo dos cortes, da tres piezas. Y así es con el método str.split (delimitador) de Python :
Sí, hay un par de formas fáciles. Uno usa str.count () y el otro usa str.splitlines () . Ambas formas darán la misma respuesta a menos que a la línea final le falte el
\n
. Si falta la nueva línea final, el enfoque str.splitlines dará la respuesta precisa. Una técnica más rápida que también es precisa utiliza el método de conteo pero luego lo corrige para la nueva línea final:La firma de str.split tiene aproximadamente 20 años, y varias API de esa época son estrictamente pragmáticas. Si bien no es perfecto, la firma del método tampoco es "terrible". En su mayor parte, las opciones de diseño de API de Guido han resistido la prueba del tiempo.
La API actual no está exenta de ventajas. Considere cadenas como:
Cuando se les pide que dividan estas cadenas en campos, las personas tienden a describir ambas utilizando la misma palabra en inglés, "dividir". Cuando se les pide que lean códigos como
fields = line.split()
ofields = line.split(',')
, las personas tienden a interpretar correctamente las declaraciones como "divide una línea en campos".La herramienta de texto a columnas de Microsoft Excel hizo una elección de API similar e incorpora ambos algoritmos de división en la misma herramienta. Las personas parecen modelar mentalmente la división de campos como un concepto único a pesar de que está involucrado más de un algoritmo.
fuente
Parece ser simplemente la forma en que se supone que funciona, de acuerdo con la documentación :
Entonces, para que quede más claro, la
split()
función implementa dos algoritmos de división diferentes y usa la presencia de un argumento para decidir cuál ejecutar. Esto podría deberse a que permite optimizar el que no tiene argumentos más que el que tiene argumentos; No lo sé.fuente
.split()
sin parámetros intenta ser inteligente. Se divide en cualquier espacio en blanco, tabulaciones, espacios, avances de línea, etc., y también omite todas las cadenas vacías como resultado de esto.Esencialmente, los
.split()
parámetros sin parámetros se usan para extraer palabras de una cadena, a diferencia de los.split()
parámetros que simplemente toman una cadena y la dividen.Esa es la razón de la diferencia.
Y sí, contar líneas dividiendo no es una manera eficiente. Cuente el número de saltos de línea y agregue uno si la cadena no termina con un salto de línea.
fuente
Uso
count()
:fuente
cat file
confunde su línea de comando y Subversion se queja. vi siempre agrega uno.Tenga en cuenta la última oración.
Para contar líneas, simplemente puede contar cuántas
\n
hay:La última parte tiene en cuenta la última línea que no termina con
\n
, aunque esto significa queHello, World!
yHello, World!\n
tiene el mismo recuento de líneas (que para mí es razonable), de lo contrario, simplemente puede agregar1
al recuento de\n
.fuente
Para contar líneas, puede contar el número de saltos de línea:
Editar :
La otra respuesta con incorporado
count
es más adecuada, en realidadfuente
count
, los bools son añadibles (de hecho, subclasificanint
), por lo que el genexp se puede escribir comosum(s == "\n" for s in the_string)
.