Tengo una lista de enteros que necesito analizar en una cadena de rangos.Manera pitónica de convertir una lista de enteros en una cadena de rangos separados por comas
Por ejemplo:
[0, 1, 2, 3] -> "0-3"
[0, 1, 2, 4, 8] -> "0-2,4,8"
Y así sucesivamente.
Todavía estoy aprendiendo más formas pitónicas de manejar listas, y esta es un poco difícil para mí. Mi último pensamiento fue para crear una lista de listas que realiza un seguimiento de pares de números:
[ [0, 3], [4, 4], [5, 9], [20, 20] ]
entonces podría iterar a través de esta estructura, imprimiendo cada sub-lista, ya sea como un rango o un único valor.
No me gusta hacer esto en dos iteraciones, pero parece que no puedo seguir cada número dentro de cada iteración. Mi pensamiento sería hacer algo como esto:
Aquí está mi intento más reciente. Funciona, pero no estoy completamente satisfecho; Sigo pensando que hay una solución más elegante que se me escapa por completo. La iteración cadena de manejo no es el mejor, lo sé - que es bastante temprano en la mañana para mí :)
def createRangeString(zones):
rangeIdx = 0
ranges = [[zones[0], zones[0]]]
for zone in list(zones):
if ranges[rangeIdx][1] in (zone, zone-1):
ranges[rangeIdx][1] = zone
else:
ranges.append([zone, zone])
rangeIdx += 1
rangeStr = ""
for range in ranges:
if range[0] != range[1]:
rangeStr = "%s,%d-%d" % (rangeStr, range[0], range[1])
else:
rangeStr = "%s,%d" % (rangeStr, range[0])
return rangeStr[1:]
¿Hay una manera sencilla que puedo combinar esto en una sola iteración? ¿Qué más podría hacer para que sea más Pythonic?
Vea una demostración de la herramienta 'more_itertools.consecutive_groups' [aquí] (https://stackoverflow.com/a/47642650/4531270). – pylang