gpt4 book ai didi

python - 迭代非连续范围

转载 作者:行者123 更新时间:2023-11-30 22:36:22 25 4
gpt4 key购买 nike

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

>>> 0
>>> 3
>>> 4
>>> 6
>>> 7
>>> 8
>>> 9

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

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]

有更好的方法吗?

最佳答案

你的代码看起来不错,但你不需要re,你可以使用Python的range函数和yield来整理一下它对生成器函数中的项目进行编码:

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]

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

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

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

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]

关于python - 迭代非连续范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44191503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com