如何让我的输出组将所有相似的数字分成特定数量的组?
How can I make my output group all similar numbers into a specific number of groups?
所以我写了这段代码,目的是让代码将列表中的不同数字组合在一起,总共 n: int
个组
编辑 如果你不明白代码的用途是什么,请看评论,我已经在那里解释了。谢谢:)
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 个元素列表中的所有可能组合。但它不会将数字组合在一起。所以我想要的是:例如,如果输入是
[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 >= len(lst)
组合
您可以尝试以下方法:
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))
输出:
[[10, 12, 45, 47], [91, 98, 99]]
[[10, 12], [45, 47], [91, 98, 99]]
[[10, 12], [45, 47], [91], [98, 99]]
诚然,它相当复杂,而且可能不那么 pythonic。可能有更有效的方法。无论如何,下面是一些解释......
在第一行中,diff
是一个包含元组 (i, d)
的(某种)列表,因此 lst
在 i-1
之间有 d
的差异第 th 项和 i
th 项。
第二行比较复杂。首先,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]
更好),您可以为此自定义一个函数。
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
所以我写了这段代码,目的是让代码将列表中的不同数字组合在一起,总共 n: int
个组
编辑 如果你不明白代码的用途是什么,请看评论,我已经在那里解释了。谢谢:)
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 个元素列表中的所有可能组合。但它不会将数字组合在一起。所以我想要的是:例如,如果输入是
[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 >= len(lst)
组合
您可以尝试以下方法:
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))
输出:
[[10, 12, 45, 47], [91, 98, 99]]
[[10, 12], [45, 47], [91, 98, 99]]
[[10, 12], [45, 47], [91], [98, 99]]
诚然,它相当复杂,而且可能不那么 pythonic。可能有更有效的方法。无论如何,下面是一些解释......
在第一行中,diff
是一个包含元组 (i, d)
的(某种)列表,因此 lst
在 i-1
之间有 d
的差异第 th 项和 i
th 项。
第二行比较复杂。首先,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]
更好),您可以为此自定义一个函数。
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