2017-10-06 20 views
0

我有一個函數,它採用'1,3-5,7,19'等格式的字符串,並將輸出列表[1, 3, 4, 5, 7, 19]使用if/else的嵌套列表理解

但是,我在想這也許足夠簡單,可以用嵌套的列表理解。

我原來的功能是:

result = [] 
for x in row_range.split(','): 
    if '-' in x: 
     for y in range(int(x.split('-')[0]), int(x.split('-')[1]) + 1)): 
      result.append(y) 
    else: 
     result.append(int(x)) 

我認爲理解是這樣的:

result = [y for x in row_range.split(',') if '-' in x else int(x) for y in range(int(x.split('-')[0]), int(x.split('-')[1] + 1)] 

甚至

result = [y for x in row_range.split(',') if '-' in x for y in range(int(x.split('-')[0]), int(x.split('-')[1] + 1) else int(x)] 

但這些都是SyntaxError錯誤。將if/else移到理解的前面

result = [y if '-' in x else int(x) for x in row_range.split(',') for y in range(int(x.split('-')[0]), int(x.split('-')[1]) + 1)] 

導致IndexError:列表索引超出範圍。

這可能嗎?我已經有一個很好地處理它的函數,並且更具可讀性,但是我只是好奇這是否可以在python中完成。

+0

只是爲了好玩,我決定[在Haskell實現這個(HTTPS://gist.github。 com/NotTheEconomist/e47de2ee01ae3fcde1926d9df705a079)(使用'split'和'text'包) –

回答

2

你可以定義一個小助手功能:

def foo(x): 
    x, y = map(int, x.split('-')) 
    return (x, y + 1) 

現在,使用列表理解嵌套循環。

>>> [y for x in row_range.split(',') 
      for y in ([int(x)] if '-' not in x else range(*foo(x)))] 
[1, 3, 4, 5, 7, 19] 
0

re.sub()功能替代解決方案:

import re 

row_range = '1,3-5,7,8,10-14,19' # extended example 
cb = lambda r: repr(list(range(int(r.group(1)), int(r.group(2))+1)))[1:-1] 
result = [int(i) for i in re.sub(r'(\d+)-(\d+)', cb, row_range).split(',')] 

print(result) 

輸出:

[1, 3, 4, 5, 7, 8, 10, 11, 12, 13, 14, 19]