用if/els实现嵌套列表理解

2024-05-04 17:56:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个函数,它接受一个格式为'1,3-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))

我想理解应该是:

^{pr2}$

甚至是

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

但这些都是语法错误。把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)]

导致索引器错误:列表索引超出范围。在

这可能吗?我已经有了一个可以很好地处理它的函数,并且更具可读性,但是我只是好奇这是否可以用python实现。在


Tags: 函数字符串in列表forif格式range
2条回答

您可以定义一个小的helper函数:

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

现在,使用带有嵌套循环的列表理解。在

^{pr2}$

具有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)

输出:

^{pr2}$

相关问题 更多 >