首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使输出组(所有类似的数字)成为特定数量的组?

如何使输出组(所有类似的数字)成为特定数量的组?
EN

Stack Overflow用户
提问于 2021-11-08 05:08:55
回答 1查看 277关注 0票数 0

因此,我编写了这段代码,目的是让代码组从一个列表中将数字与n: int组放在一起。

编辑如果您不理解代码的目的,请查看注释,我已经在这里解释过了。谢谢您:)

代码语言:javascript
复制
def calcdifference(lst: list):
    for x in lst:
        return (x -= x)
print(calcdifference(lst=[4,5,6,4,3,2,3,4,5]))

def grouping(lst: list, n: int):
    if calcdifference(x) in list == max(calcdifference(x)):
        lst.append(x)
print(grouping(lst=[4,5,6,4,3,2,3,4,5]))

n: int表示从单个列表中允许的组数,因此如果n为3,则数字将分组为(x,.),(x,.)(x .)如果n=2时,则将数字分组为(x,..),(x,.)。

但是,我的代码在n个元素列表中打印出所有可能的组合。但它不能把数字组合在一起。所以我想要的是:例如,如果输入是

代码语言:javascript
复制
[10,12,45,47,91,98,99]

如果n=2时,输出将是

代码语言:javascript
复制
[10,12,45,47] [91,98,99]

如果n= 3,输出将是

代码语言:javascript
复制
[10,12] [45,47] [91,98,99]

我应该对我的代码做什么更改?

备注:请不要使用内置函数或导入,因为我希望尽可能少使用内置函数

重要:代码应该能够为所提供的每个列表打印n >= len(lst)组合

EN

Stack Overflow用户

回答已采纳

发布于 2021-11-08 06:20:32

您可以尝试以下方法:

代码语言:javascript
复制
def grouping(lst, n):
    diff = enumerate((abs(x - y) for x, y in zip(lst, lst[1:])), start=1)
    cut = sorted(x[0] for x in sorted(diff, reverse=True, key=lambda x: x[1])[:n-1])
    cut = [0, *cut, len(lst)] # add 0 and last index
    return [lst[i:j] for i, j in zip(cut, cut[1:])] # return slices

lst = [10,12,45,47,91,98,99]
print(grouping(lst, 2))
print(grouping(lst, 3))
print(grouping(lst, 4))

输出:

代码语言:javascript
复制
[[10, 12, 45, 47], [91, 98, 99]]
[[10, 12], [45, 47], [91, 98, 99]]
[[10, 12], [45, 47], [91], [98, 99]]

诚然,这是相当复杂的,也许不太重要。也许有一个更有效的方法。不管怎样,下面是一些解释..。

在第一行中,diff是一个(某种程度上)包含元组(i, d)的列表,因此lsti-1th item和ith item之间有d的区别。

第二行比较复杂。首先,sorted(diff, reverse=True, key=lambda x: x[1])根据第二个元素对这些元组进行排序,即表示最高跳跃的元组优先。

然后sorted(...)[:n-1]选择第一个n-1元组。这些将是n-1削减将使用的。

生成器理解(x[0] for x in ...)只是选择每个元组的第一项,也就是说,我们不再需要差异。

然后,sorted(...)将对那些削减的位置进行排序,这将使后续的行正常工作。

如果您出于某种原因不愿使用lambda (实际上,operator.itemgetter(1)lambda x: x[1]更好),您可以为此创建一个自定义函数。

代码语言:javascript
复制
def get_1st(x):
    return x[1]

def grouping(lst, n):
    diff = enumerate((abs(x - y) for x, y in zip(lst, lst[1:])), start=1)
    cut = sorted(x[0] for x in sorted(diff, reverse=True, key=get_1st)[:n-1])
    cut = [0, *cut, len(lst)] # add 0 and last index
    return [lst[i:j] for i, j in zip(cut, cut[1:])] # return slices
票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69878871

复制
相关文章

相似问题

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