首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >遍历一个非顺序范围

遍历一个非顺序范围
EN

Stack Overflow用户
提问于 2017-05-25 23:56:18
回答 2查看 1.1K关注 0票数 1

我想迭代一遍不连续的范围。换句话说,跳过基于用户输入的某些索引/元素,如下所示。

代码语言:javascript
复制
>>> 0
>>> 3
>>> 4
>>> 6
>>> 7
>>> 8
>>> 9

我不知道怎么做,所以我尝试了这个方法。

代码语言:javascript
复制
import re

>>> crazyrange = '0, 3-4, 6, 7-9'    # User input string
>>> crazyrange = re.split (', ', crazyrange)
>>> crazyrange
['0', '3-4', '6', '7-9']
>>>
>>> masterlist = []
>>> def get_range (values):
    rangelist = []
    for i in range (int (values [0]), int (values [1]) + 1):
        rangelist.append (i)
    return rangelist
>>>
>>> for i in crazyrange:
    if '-' in i:
        values = i.split ('-')
        masterlist.extend (get_range (values))
    else:
        masterlist.append (int (i))
>>>
>>> masterlist
[0, 3, 4, 6, 7, 8, 9]

有更好的方法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-26 00:07:11

您的代码看起来很好,但是您不需要re,您可以通过使用python的range函数和从生成器函数中的yield来清理它:

代码语言:javascript
复制
crazyrange = '0, 3-4, 6, 7-9'    # User input string

def get_range(range_string):
    items = range_string.replace(" ", "").split(",")
    for i in items:
        if '-' in i:
            start, end = i.split('-')
            for j in range(int(start), int(end)+1): # range() is not inclusive
                yield j
        else:
            yield int(i)

for x in get_range(crazyrange):
    print x

print list(get_range(crazyrange))
# [0, 3, 4, 6, 7, 8, 9]

还有一个没有显式循环的选项:

代码语言:javascript
复制
crazyrange = '0, 3-4, 6, 7-9'    # User input string
import itertools
items = [i.split("-") for i in crazyrange.split(", ")]
range_list = [range(int(i[0]), int(i[-1])+1) for i in items]
print list(itertools.chain(*range_list))

或者这个选项可能是最简单的:

代码语言:javascript
复制
crazyrange = '0, 3-4, 6, 7-9'    # User input string

def get_range(item):
    pair = item.split('-')  # may only be one item, but that's OK
    return range(int(pair[0]), int(pair[-1])+1)

items = crazyrange.split(', ')
print [i for item in items for i in get_range(item)]
# [0, 3, 4, 6, 7, 8, 9]
票数 2
EN

Stack Overflow用户

发布于 2017-05-26 00:37:19

您可以使用list comprehension在较少的代码中获得相同的输出。

代码语言:javascript
复制
crazyrange = '0, 3-4, 6, 7-9'

ranges = [range(int(k.split("-")[0]), int(k.split("-")[-1]) +1) for k in crazyrange.split(',')]

print(ranges)
print([j for k in ranges for j in k])

输出:

代码语言:javascript
复制
[range(0, 1), range(3, 5), range(6, 7), range(7, 10)]
[0, 3, 4, 6, 7, 8, 9]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44191503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档