Как преобразовать числовые диапазоны строк в список в Python

Я хотел бы иметь возможность преобразовать строку, такую ​​как «1,2,5-7,10» в список python, такой как [1,2,5,6,7,10]. Я огляделся и нашел это , но мне было интересно, есть ли в Python чистый и простой способ сделать это.

6 Solutions collect form web for “Как преобразовать числовые диапазоны строк в список в Python”

>>> def f(x): ... result = [] ... for part in x.split(','): ... if '-' in part: ... a, b = part.split('-') ... a, b = int(a), int(b) ... result.extend(range(a, b + 1)) ... else: ... a = int(part) ... result.append(a) ... return result ... >>> f('1,2,5-7,10') [1, 2, 5, 6, 7, 10] 

Я смог по- настоящему понять этот вопрос:

 >>> def f(s): return sum(((list(range(*[int(j) + k for k,j in enumerate(i.split('-'))])) if '-' in i else [int(i)]) for i in s.split(',')), []) >>> f('1,2,5-7,10') [1, 2, 5, 6, 7, 10] >>> f('1,3-7,10,11-15') [1, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15] 

другой ответ, претендующий на понимание, был просто циклом for, потому что окончательный список был отброшен. 🙂

Для python 2 вы можете даже удалить вызов в list !

Это может быть излишним, но мне просто нравится пиражирование:

from pyparsing import *

 def return_range(strg, loc, toks): if len(toks)==1: return int(toks[0]) else: return range(int(toks[0]), int(toks[1])+1) def parsestring(s): expr = Forward() term = (Word(nums) + Optional(Literal('-').suppress() + Word(nums))).setParseAction(return_range) expr << term + Optional(Literal(',').suppress() + expr) return expr.parseString(s, parseAll=True) if __name__=='__main__': print parsestring('1,2,5-7,10') 

Фу, ответы настолько подробные! Вот короткий и изящный ответ:

 def rangeString(commaString): def hyphenRange(hyphenString): x = [int(x) for x in hyphenString.split('-')] return range(x[0], x[-1]+1) return chain(*[hyphenRange(r) for r in commaString.split(',')]) 

Демо-версия:

 >>> list( f('1,2,5-7,10') ) [1, 2, 5, 6, 7, 10] 

Легко модифицируется для обработки отрицательных чисел или возврата списка. Также вам понадобится from itertools import chain , но вы можете заменить sum(...,[]) на него, если вы не работаете с объектами range (или sum(map(list,iters),[]) ), не заботьтесь о лени.

Никакое понимание не бьет меня!

 import re def convert(x): return sum((i if len(i) == 1 else list(range(i[0], i[1]+1)) for i in ([int(j) for j in i if j] for i in re.findall('(\d+),?(?:-(\d+))?', x))), []) 

Лучше всего то, что я использую переменную i дважды в середине понимания.

 >>> convert('1,2,5-7,10') [1, 2, 5, 6, 7, 10] 

Очень короткий и элегантный (imho):

 >>> txt = "1,2,5-7,10" >>> # construct list of xranges >>> xranges = [(lambda l: xrange(l[0], l[-1]+1))(map(int, r.split('-'))) for r in txt.split(',')] >>> # flatten list of xranges >>> [y for x in xranges for y in x] [1, 2, 5, 6, 7, 10] 
  • Проверить наличие гласных в слове, python
  • Как создать изменяемый класс строк, который может использоваться как фактическая строка?
  • Лучший способ вернуть язык данной строки
  • Как я могу получить список имен, используемых в строке форматирования?
  • странный объект 'str' не вызываемый python
  • извлечение температурных градусов (celcius или fahrenheit) из струны
  • Как сделать исполняемый файл скрипта python?
  • Как заставить str.translate работать с строками Unicode?
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.