如何找到压缩列表中的一个元素,其配对元素的除法最大值?

Posted

技术标签:

【中文标题】如何找到压缩列表中的一个元素,其配对元素的除法最大值?【英文标题】:How to find an element of zipped list, that have a maximum value of division of its paired elements? 【发布时间】:2016-04-13 12:46:45 【问题描述】:

大家! 我遇到了这样的问题: 我从两个分开的列表中创建了压缩列表,我正在输入

if __name__ == "__main__":
    data = list(map(int, sys.stdin.read().split()))
    n, capacity = data[0:2]
    values = data[2:(2 * n + 2):2]
    weights = data[3:(2 * n + 2):2]
    ziplist = list(zip(values,weights))
    opt_value = get_optimal_value(capacity, weights, values)

所以,当我打字时

3 40
20 40
50 60
70 80

我有这样的清单

[(20, 40), (50, 60), (70, 80)]

现在,我需要了解这个压缩列表的元素具有每对除法的最大值。

m = list(x/y for x,y in ziplist) 

结果是:

[0.5, 0.8333333333333334, 0.875]

所以,很明显,我需要使用最后一对。但是我应该如何正确编码呢?我想避免以某种方式使用额外的列表 m。一般来说,我需要找到压缩列表的索引 -> 然后从这个元素中获取值权重。所以,我的最终输出是 80。

另外,我认为,我可能会走错路 - 因为实际上,我正在尝试解决分数背包问题,所以我正在尝试找到重量和价值比例最佳的元素。

【问题讨论】:

你可以做max([x/y for x,y in ziplist]) 您是如何将整数除以产生浮点结果的? @ScottHunter 这就是 Python 3 中的除法行为(// 运算符将产生整数结果)。 【参考方案1】:

要获取数字列表中最大元素的索引,您可以应用以下内容

argmax = max(enumerate(list_of_numbers), key=lambda x: x[1])[0]

这样做是将您的数字列表转换为 (index, value) 对的元组列表,然后选择第二个值最大的对。然后它从该对(索引)中获取第一个值并将其存储在变量argmax

【讨论】:

非常好,正是我想回答的。但是我会直接写... enumerate(x/y for x,y in ziplist) ...以避免在内存中创建一个新的命名列表,而是直接使用一个未命名的生成器。

以上是关于如何找到压缩列表中的一个元素,其配对元素的除法最大值?的主要内容,如果未能解决你的问题,请参考以下文章

如何将列表中的两个最大元素相加?

python 列表多个元素如何配对去重呢?

最优点配对问题(紫书)

如何在指数级大列表中找到第 k 个最大的元素?

如何找到列表中两个元素的最大乘积?

如何使用 OCaml 将两个列表中的每个单独元素压缩到一个列表中