¿Qué es el equivalente a pitones de Ruby's each_slice(count)
?
Quiero tomar 2 elementos de la lista para cada iteración.
Me gusta para [1,2,3,4,5,6]
Quiero manejar 1,2
en la primera iteración luego 3,4
luego 5,6
.
Por supuesto, hay una forma indirecta de usar valores de índice. Pero, ¿hay una función directa o de alguna manera para hacer esto directamente?Python equivalente a cada_slice de Ruby (conteo)
Respuesta
Hay una recipe para esto en el itertools documentation llamado mero:
from itertools import izip_longest
def grouper(n, iterable, fillvalue=None):
"grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return izip_longest(fillvalue=fillvalue, *args)
uso como esto:
>>> l = [1,2,3,4,5,6]
>>> for a,b in grouper(2, l):
>>> print a, b
1 2
3 4
5 6
Nota: use ** zip_longest ** en lugar de ** izip_longest ** para python 3. – bwv549
Igual que Marcos, pero renombrado a 'each_slice' y trabaja para Python 2 y 3 :
try:
from itertools import izip_longest # python 2
except ImportError:
from itertools import zip_longest as izip_longest # python 3
def each_slice(iterable, n, fillvalue=None):
args = [iter(iterable)] * n
return izip_longest(fillvalue=fillvalue, *args)
Duplica el comportamiento de ruby's each_slice para un pequeño trai ling rebanada:
def each_slice(size, iterable):
""" Chunks the iterable into size elements at a time, each yielded as a list.
Example:
for chunk in each_slice(2, [1,2,3,4,5]):
print(chunk)
# output:
[1, 2]
[3, 4]
[5]
"""
current_slice = []
for item in iterable:
current_slice.append(item)
if len(current_slice) >= size:
yield current_slice
current_slice = []
if current_slice:
yield current_slice
las respuestas anteriores almohadilla voluntad la última lista (es decir, [5, Ninguno]), que puede no ser lo que se desea en algunos casos.
Una mejora en los dos primeros: si el elemento iterable cortado no es exactamente divisible por n, el último se rellenará con n a la longitud n. Si esto está causando que escribe errores, puede hacer un pequeño cambio:
def each_slice(iterable, n, fillvalue=None):
args = [iter(iterable)] * n
raw = izip_longest(fillvalue=fillvalue, *args)
return [filter(None, x) for x in raw]
Tenga en cuenta que esto eliminará todo Nada es de la gama, por lo que sólo debe utilizarse en casos donde no se producirán errores en el camino.
- 1. Python Equivalente a #each_cons de Ruby?
- 2. Ruby equivalente a la ayuda de Python()?
- 3. Python equivalente de Perl/Ruby || =
- 4. Ruby equivalente de Python setattr()
- 5. equivalente en Python de 'method_missing' de Ruby
- 6. ¿Hay un Python equivalente a los símbolos de Ruby?
- 7. Ruby LESS equivalente de gema en Python
- 8. Ruby equivalente al "dir" de Python?
- 9. Python equivalente de continuaciones con Ruby
- 10. Equivalente a "continuar" en Ruby
- 11. Ruby equivalente a PHP $ this
- 12. Conteo rectangular de Python Matplotlib
- 13. Python equivalente a Jstack?
- 14. Python equivalente a find2perl
- 15. Python Equivalente a phpinfo()
- 16. Ruby "es" equivalente
- 17. ¿Cuál es el equivalente Ruby de os.walk de Python?
- 18. Python equivalente de Sinatra
- 19. ¿Cuál es el equivalente de Python al "inspeccionar" de Ruby?
- 20. Ruby equivalente de NumPy
- 21. ¿Cuál es el equivalente Ruby de python setup.py develop?
- 22. Python equivalente a atoi/atof
- 23. Clojure equivalente a Python doctest?
- 24. Python equivalente a "php -s"
- 25. Equivalente a Maven para python
- 26. Rubí equivalente a Python __main__
- 27. Python equivalente a C# .Seleccione?
- 28. Python equivalente a C++ getline()
- 29. ruby / rails equivalente a javascript decodeURIComponent?
- 30. ¿Tiene Ruby/Rails un equivalente a ++?
La respuesta de la marca cumple por completo las especificaciones que proporcionó en su pregunta. Sin embargo, es importante tener en cuenta que el comportamiento que especificó se desvía del ruby each_slice: si el último slice es más corto que el resto, se rellenará con fillvalue, mientras que en ruby's each_slice no será más que un array acortado. Si desea esta lista abreviada/comportamiento iterable, entonces la respuesta de Mark no funcionará. – bwv549