繁体   English   中英

如何让我的输出将所有数字组合在一起?

[英]How can I make my output group all numbers together?

所以我试图找到如何将相似的数字分组到不同的列表中。 我尝试查看一些来源,例如( Python 中的分组/聚类数字),但所有这些都需要导入 itertools 并使用 itertools.groupby,我不想要它,因为我不想使用内置函数。

到目前为止,这是我的代码。

def n_length_combo(lst, n):
    if n == 0:
        return [[]]

    l = []
    for i in range(0, len(lst)):

        m = lst[i]
        remLst = lst[i + 1:]

        for p in n_length_combo(remLst, n - 1):
            l.append([m] + p)

    return l

print(n_length_combo(lst=[1,1,76,45,45,4,5,99,105],n=3))

编辑n: int表示一个列表中允许的组数,因此如果 n 为 3,则数字将分组为 (x,...), (x,....) (x,...) ) 如果 n = 2,数字将被分组在 (x,..),(x,...)

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

[10,12,45,47,91,98,99]

如果 n = 2,输出将是

[10,12,45,47] [91,98,99]

如果 n = 3,输出将是

[10,12] [45,47] [91,98,99]

我应该对我的代码进行哪些更改?

假设n是您想要的组/分区数:

import math

def partition(nums, n):
    partitions = [[] for _ in range(n)]
    min_, max_ = min(nums), max(nums)
    r = max_ - min_ # range of the numbers
    s = math.ceil(r / n) # size of each bucket/partition
    for num in nums:
        p = (num - min_) // s
        partitions[p].append(num)
    return partitions

nums = [10,12,45,47,91,98,99]

print(partition(nums, 2))
print(partition(nums, 3))

印刷:

[[10, 12, 45, 47], [91, 98, 99]]
[[10, 12], [45, 47], [91, 98, 99]]

您正在尝试将一维数组转换为二维数组。 请原谅命名不当的变量,但总体思路如下。 它相当容易解析,但基本上我们要做的是首先找出二维矩阵的行大小,给定一维矩阵的长度和所需的列数。 如果这不能完全划分,我们将向行添加一个。 然后我们创建一个循环来计算列数,并在其中创建另一个循环来计算行数。 我们将二维数组的当前位置 (r,c) 映射到一维数组的索引。 如果数组索引越界,我们放 0(或 None 或 -1 或什么都不做),否则我们将值从一维数组复制到二维数组。 好吧,实际上我们在 cols 循环中创建了一个一维数组,当循环完成时,我们将其附加到 lst2 数组。

def transform2d(lst, cols):
    size = len(lst)
    
    rows = int(size/cols)
    if cols * rows < size:
        rows+=1

    lst2 = []
    for c in range(cols):
        a2 = []
        for r in range(rows):
            i = c*cols + r
            if i < size:
                a2.append(lst[i])
            else:
                a2.append(0)  # default value
        lst2.append(a2)
    return lst2

i = [10,12,45,47,91,98,99]
r = transform2d(i, 2)
print(r)
r = transform2d(i, 3)
print(r)

除了为二维数组中的额外元素打印 0 之外,输出与您指定的一样。 这可以通过删除执行此操作的 else 来更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM