如何从列表中选择一个数字序列?
How to pick a sequence of numbers from a list?
我有一个开始编号和一个结束编号。
我需要从这些数字中选择一个数字序列。
序列并不总是相同的。
示例:
startnumber = 1
endnumber = 32
我需要创建一个具有特定顺序的数字列表
p.e.
3 个数字是,2 个数字不是,3 个数字是,2 个数字不是.. 等等
预期输出:
[[1-3],[6-8],[11-13],[16-18],[21-23],[26-28],[31-32]]
(最后只剩下2个号码(31和32))
在python到select一系列数字的行序列中是否有简单的方法?
numbers = range(1,33)
take = 3
skip = 2
seq = [list(numbers[idx:idx+take]) for idx in range(0, len(numbers),take+skip)]
推断出:
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 的文档字符串中提到的那样,get_data 的 filterfunc
实际上只是期待基于调用的 True
或 False
.您可以轻松地将其更改为签名:
def filterfunc(some_data: object) -> bool:
这样你就可以根据值(甚至索引)来决定是接受还是离开,但它目前不接受任何参数,只是作为一个不那么神奇的功能itertools.cycle
(因为它应该return 调用时的值,而不是迭代时的值)
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 的序列,
pick
/skip
都没有。元素到 pick/skip,
skip_first
设置为 True
如果
这种行为是需要的。
grouper
returns n 个元素的块,它
如果最后一组较少,则忽略最后一组
比 min_chunk 元素。
它来自于给出的东西
.
演示:
# 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
的替代实现:
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
我有一个开始编号和一个结束编号。
我需要从这些数字中选择一个数字序列。
序列并不总是相同的。
示例:
startnumber = 1
endnumber = 32
我需要创建一个具有特定顺序的数字列表
p.e.
3 个数字是,2 个数字不是,3 个数字是,2 个数字不是.. 等等
预期输出:
[[1-3],[6-8],[11-13],[16-18],[21-23],[26-28],[31-32]]
(最后只剩下2个号码(31和32))
在python到select一系列数字的行序列中是否有简单的方法?
numbers = range(1,33)
take = 3
skip = 2
seq = [list(numbers[idx:idx+take]) for idx in range(0, len(numbers),take+skip)]
推断出:
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 的文档字符串中提到的那样,get_data 的 filterfunc
实际上只是期待基于调用的 True
或 False
.您可以轻松地将其更改为签名:
def filterfunc(some_data: object) -> bool:
这样你就可以根据值(甚至索引)来决定是接受还是离开,但它目前不接受任何参数,只是作为一个不那么神奇的功能itertools.cycle
(因为它应该return 调用时的值,而不是迭代时的值)
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 的序列,
pick
/skip
都没有。元素到 pick/skip,
skip_first
设置为 True
如果
这种行为是需要的。
grouper
returns n 个元素的块,它
如果最后一组较少,则忽略最后一组
比 min_chunk 元素。
它来自于给出的东西
.
演示:
# 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
的替代实现:
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