首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从列表中选择一个数字序列?

如何从列表中选择一个数字序列?
EN

Stack Overflow用户
提问于 2017-01-24 16:52:09
回答 3查看 975关注 0票数 0

我有一个起始数和一个结束号。

从这些数字中,我需要选择一系列的数字。

序列并不总是一样的。

示例:

代码语言:javascript
运行
复制
startnumber = 1
endnumber = 32

我需要创建一个具有特定序列的数字列表

体育课。

三个数字是,两个数字不,三个数字是,两个数字不..。等

预期产出:

代码语言:javascript
运行
复制
[[1-3],[6-8],[11-13],[16-18],[21-23],[26-28],[31-32]]

(最后只剩下两个数字(31和32))

在python中是否有一种从一系列数字中选择行序列的简单方法?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-01-24 16:59:29

代码语言:javascript
运行
复制
numbers = range(1,33)
take = 3
skip = 2
seq = [list(numbers[idx:idx+take]) for idx in range(0, len(numbers),take+skip)]
票数 4
EN

Stack Overflow用户

发布于 2017-01-24 17:19:30

由此推断:

代码语言:javascript
运行
复制
def get_data(data, filterfunc=None):
    if filterfunc is None:
        filterfunc = lambda: True  # take every line

    result = []
    sub_ = []
    for line in data:
        if filterfunc():
            sub_.append(line)
        else:
            if sub_:
                result.append(sub_)
                sub_ = []

    return result

# Example filterfunc
def example_filter(take=1, leave=1):
    """example_filter is a less-fancy version of itertools.cycle"""

    while True:
        for _ in range(take):
            yield True
        for _ in range(leave):
            yield False

# Your example
final = get_data(range(1, 33), example_filter(take=3, leave=2))

正如example_filter的docstring中所暗示的那样,filterfunc for get_data实际上只是基于调用来期待TrueFalse。您可以很容易地将其更改为签名:

代码语言:javascript
运行
复制
def filterfunc(some_data: object) -> bool:

这样您就可以根据值(甚至是索引)来决定是接受还是离开,但是它目前没有参数,只是作为一个不那么神奇的itertools.cycle (因为它应该在调用时返回它的值,而不是在迭代中)。

票数 1
EN

Stack Overflow用户

发布于 2017-01-24 20:04:44

代码语言:javascript
运行
复制
from itertools import islice
def grouper(iterable, n, min_chunk=1):
    it = iter(iterable)
    while True:
       chunk = list(islice(it, n))
       if len(chunk) < min_chunk:
           return
       yield chunk

def pick_skip_seq(seq, pick, skip, skip_first=False):
    if skip_first:
        ret = [ x[skip:] for x in grouper(seq, pick+skip, skip+1) ]
    else:
        ret = [ x[:pick] for x in grouper(seq, pick+skip) ]
    return ret

pick_skip_seq(range(1,33), 3, 2)给出了所需的列表。

pick_skip_seq(seq, pick, skip, skip_first=False)中,seq是可选择/跳过的序列,pick/skip为no。对于要选择/跳过的元素,如果需要这样的行为,则将skip_first设置为True

grouper返回n个元素的块,如果它的值小于min_chunk元素,它将忽略最后一个组。它是从https://stackoverflow.com/a/8991553/1921546给出的东西中派生出来的。

演示:

代码语言:javascript
运行
复制
# pick 3 skip 2 
for i in range(30,35):
    print(pick_skip_seq(range(1,i), 3, 2))

# skip 3 pick 2 
for i in range(30,35):
    print(pick_skip_seq(range(1,i), 3, 2, True))

pick_skip_seq**:**的替代实现--

代码语言:javascript
运行
复制
from itertools import chain,cycle,repeat,compress
def pick_skip_seq(seq, pick, skip, skip_first=False):
    if skip_first:
        c = cycle(chain(repeat(0, skip), repeat(1, pick)))
    else:
        c = cycle(chain(repeat(1, pick), repeat(0, skip)))
    return list(grouper(compress(seq, c), pick))

所有使用的东西都记录在这里:https://docs.python.org/3/library/itertools.html#itertools.compress

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41833869

复制
相关文章

相似问题

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