Estoy tratando de obtener una lista del rango de números en una cadena. ¿Cómo puedo hacer eso en Python 3?

Quiero convertir la siguiente cadena:

s = "1-4, 6, 7-10"

En esta lista:

l = [1, 2, 3, 4, 6, 7, 8, 9, 10]
1
Константин Березин 27 may. 2020 a las 18:37

5 respuestas

La mejor respuesta

Primero puede dividir en ',' caracteres. Si encuentra un valor único, simplemente conviértalo a int. Si encuentra un guión, conviértalo a un rango de enteros.

def listify(s):
    output = []
    for i in s.split(','):
        if '-' in i:
            start, stop = [int(j) for j in i.split('-')]
            output += list(range(start, stop+1))
        else:
            output.append(int(i))
    return output

>>> listify("1-4, 6, 7-10")
[1, 2, 3, 4, 6, 7, 8, 9, 10]
3
Cory Kramer 27 may. 2020 a las 15:41

Así:

s = "3-12, 7, 1, 3-6"
d = []
for l in s.split(', '):
    if '-' in l:
        q = l.split('-')
        for n in range(int(q[0]),int(q[1])+1):
            d.append(n)
    else:
        d.append(int(l))
print(d)

Salida:

[3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 7, 1, 3, 4, 5, 6]
0
Ann Zen 27 may. 2020 a las 15:55

Si está realmente motivado para hacer esto de la manera más compacta posible, puede hacerse como una comprensión anidada:

>>> [i
...     for r in (list(map(int, q.split("-")))
...         for q in s.split(", ")
...     ) for i in range(r[0], r[-1]+1)
... ]
[1, 2, 3, 4, 6, 7, 8, 9, 10]

Aquí se construye paso a paso:

>>> s.split(", ")
['1-4', '6', '7-10']
>>> [q.split("-") for q in s.split(", ")]
[['1', '4'], ['6'], ['7', '10']]
>>> [list(map(int, q.split("-")))
...     for q in s.split(", ")
... ]
[[1, 4], [6], [7, 10]]
>>>
>>> [range(r[0], r[-1]+1)
...     for r in (list(map(int, q.split("-")))
...     for q in s.split(", "))
... ]
[range(1, 5), range(6, 7), range(7, 11)]
>>>
>>> [i
...     for r in (list(map(int, q.split("-")))
...         for q in s.split(", ")
...     ) for i in range(r[0], r[-1]+1)
... ]
[1, 2, 3, 4, 6, 7, 8, 9, 10]
0
Samwise 27 may. 2020 a las 16:04

Tiene una lista que puede tener un int o un rango,
puedes iterar y manejarlos por separado

In [8]: series = []

In [9]: for token in "1-4, 6, 7-10".split(","):
   ...:     token = token.strip()
   ...:     if token.isnumeric():
   ...:         series.append(int(token))
   ...:     else:
   ...:         s, e = tuple(map(int, token.split("-")))
   ...:         # splits "4-6" and converts to int
   ...:         series.extend(list(range(s, e+1)))
   ...:

In [10]: series
Out[10]: [1, 2, 3, 4, 6, 7, 8, 9, 10]
0
mojozinc 27 may. 2020 a las 15:45
s = "1-4, 6, 7-10"
s_split = s.split(', ')
final = []
for i in s_split:
 if i.count('-'):
  start, stop = int(i.split('-')[0]), int(i.split('-')[1])
  final += list(range(start, stop + 1))
 else:
  final += [int(i)]
0
Abhishek Verma 27 may. 2020 a las 15:41