Получить список чисел из строки с диапазонами номеров - PullRequest
1 голос

Я пытаюсь получить список из диапазона чисел в строке. Как я могу это сделать в Python 3?

Я хочу преобразовать следующую строку:

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

в этот список:

l = [1, 2, 3, 4, 6, 7, 8, 9, 10]

Ответы [ 4 ]

3 голосов
/ 27 мая 2020

Сначала вы можете разбить на ',' символы. Если вы найдете одно значение, просто преобразуйте его в int. Если вы найдете da sh, преобразуйте его в диапазон целых чисел.

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]
0 голосов
/ 27 мая 2020

Если у вас действительно есть мотивация сделать это как можно компактнее, это можно сделать как вложенное понимание:

>>> [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]

Здесь оно построено шаг за шагом:

>>> 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 голосов
/ 27 мая 2020

Вот так:

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)

Вывод:

[3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 7, 1, 3, 4, 5, 6]
0 голосов
/ 27 мая 2020

У вас есть список, который может иметь либо int, либо диапазон,
вы можете перебирать и обрабатывать их отдельно

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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...