2011-06-19 15 views

Odpowiedz

27
>>> 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] 
+0

że działa świetnie. Dzięki! – jncraton

+4

To by zrobił ładny generator. –

+0

@ Jon pamiętaj, aby zaakceptować odpowiedź, jeśli była przydatna! Zobacz [faq # howtoask] ... dzięki! – Trufa

2

To może być przesada, ale tak jak pyparsing:

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') 

3

byłem w stanie dokonać prawdziwą zrozumieniem na to pytanie:

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

się inna odpowiedź, która udawała, że ​​jest zrozumiała, była po prostu pętlą for, ponieważ ostatnia lista została odrzucona. :)

Dla Pythona 2 można nawet usunąć połączenie z list!

1

Ugh, odpowiedzi są tak pełne gadek! Oto odpowiedź krótka i elegancki:

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(',')]) 

Demo:

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

łatwo modyfikowalny obsłużyć liczb ujemnych lub zwróci listę. Będziesz także potrzebował from itertools import chain, ale możesz go zastąpić sum(...,[]), jeśli nie pracujesz z obiektami range (lub sum(map(list,iters),[])) i nie dbasz o to, aby być leniwym.

1

Bezrozumienie bije moje!

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

Najlepsze jest to, że dwa razy użyć zmiennej i w środku zrozumieniem.

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

bardzo krótki, a elegancki (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] 
Powiązane problemy