python - 如何使我的输出将所有相似的数字组合成特定数量的组?
问题描述
所以我写了这段代码,目的是让代码将列表中的不同数字组合在一起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)
,使得th 项和th 项之间lst
存在差异。d
i-1
i
第二行更复杂。首先,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
推荐阅读
- java - 以漂亮的文本格式化结构化日志(单行序列化 JSON)的“gcloud app logs tail”输出
- node.js - nodejs计算具有相同值的dynamodb记录-聚合分组
- php - PDO 驱动程序在 Debian 10 中没有价值
- ios - 如何将关联域附加到 CoreNFC 中 NFCNDEFPayload 的 NFC 标签中
- java - Android 应用程序在模拟器中使用 java 代码崩溃
- html - 如何使用 JQUERY 检查所有“th”值?
- java - 如何在放心的拦截器中设置内容类型?
- python - python pandas,删除用于任何 DataFrame 特定列的重复功能,但有一个例外:
- google-cloud-platform - 谷歌云平台如何限制用户使用单个VPC?
- android - 在 Android 10 中,Picasso 能够在没有任何权限的情况下真正显示带有图像的 Uri 的图像,但 openInputStream 需要权限