[英]Nested List Comprehension with if/else
我有一個函數,該函數采用諸如'1,3-5,7,19'之類的格式的字符串,並將輸出列表[1, 3, 4, 5, 7, 19]
1、3、4、5、7、19 [1, 3, 4, 5, 7, 19]
。
但是,我在想,這可能很簡單,可以完成嵌套列表的理解。
我的原始功能是:
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中完成。
您可以定義一個小的輔助函數:
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]
使用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]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.