Python - 字典中元组值的乘积


Python 中的字典被广泛用于以键值对的形式存储数据。很多时候,我们会遇到需要查找字典中作为值的元组中元素的乘积的情况。这种情况通常发生在处理数据操作或分析时。通过本文,我们将编写代码并了解解包字典和计算每个索引处元组元素乘积的各种方法。

输入

{'a': (1, 3, 5, 7), 'b': (2, 4, 6, 8), 'c': (2, 3, 5, 7)}

输出

(4, 36, 150, 392)

方法 1:使用元组解包和 zip() 函数

在这种方法中,我们将尝试从字典中获取元组并对其进行解包以获取乘积。然后,通过 zip() 将相同索引的值组合在一起,我们能够生成元组中每个元素的乘积。

示例

# Define a function to calculate the product of elements in a tuple
def prodTup(inp):
   out = 1
   for item in inp:
      out *= item
   return out

# Create a dictionary with tuples as values
inpDict = {'a': (1, 3, 5, 7), 'b': (2, 4, 6, 8), 'c': (2, 3, 5, 7)}

# Print the input dictionary
print("Input Dictionary: " + str(inpDict))

# Calculate the product of elements at the same indices across the tuples
result = tuple(prodTup(ele) for ele in zip(*inpDict.values()))

# Print the calculated products
print("Output: " + str(result))

输出

Input Dictionary: {'a': (1, 3, 5, 7), 'b': (2, 4, 6, 8), 'c': (2, 3, 5, 7)}
Output: (4, 36, 150, 392)

因此,我们解包了字典,并且只保留了值。Zip 帮助我们将作为值的元组括起来,因此乘积函数会迭代这些括起来的元素。最终输出如预期。

方法 2:使用元组解包和 map() 函数

map 函数将帮助我们在元组上迭代乘积函数。元组可以被解包并排列,以便我们可以映射乘积。这可以通过循环和列表轻松完成。

示例

# getting Product
def prodTup(inp):
   res = 1
   for ele in inp:
      res *= ele
   return res

# Create a dictionary with tuples as values
inpDict = {'a': (1, 3, 5, 7), 'b': (2, 4, 6, 8), 'c': (2, 3, 5, 7)}

# Print the input dictionary
print("Input Dictionary: " + str(inpDict))

# Using tuple unpacking for transposing
tempList = [list(sub) for sub in inpDict.values()]
transposedTempList = [tuple(row[i] for row in tempList) for i in range(len(tempList[0]))]
result = tuple(map(prodTup, transposedTempList))

# Printing the result
print("Output: ", result)

输出

Input Dictionary: {'a': (1, 3, 5, 7), 'b': (2, 4, 6, 8), 'c': (2, 3, 5, 7)}
Output:  (4, 36, 150, 392)

因此,我们使用了元组解包来获取转置形式,以便正确地映射元组中的索引元素,以便乘积函数能够通过 map 进行迭代。尽管代码变得有点长,但可以进行优化。

方法 3:利用 map()、lambda 和 reduce()

现在让我们尝试生成所需的输出,但不是使用循环来迭代乘积函数,而是使用 map()、lambda,它可以帮助我们在可迭代对象上运行函数。reduce() 方法将用于乘积函数。

示例

import operator
from functools import reduce

def calculatePro(tuples_dict):
   return tuple(map(lambda *args: reduce(operator.mul, args), *tuples_dict.values()))

inputDict = {'a': (1, 3, 5, 7), 'b': (2, 4, 6, 8), 'c': (2, 3, 5, 7)}
print("Input list: " + str(inputDict))

result = calculatePro(inputDict)

print("Output: " + str(result))

输出

Input list: {'a': (1, 3, 5, 7), 'b': (2, 4, 6, 8), 'c': (2, 3, 5, 7)}
Output: (4, 36, 150, 392)

一个简单的单行返回函数实际上计算了乘积,正如我们所看到的。我们用 lambda 传递 map,它可以帮助我们迭代字典中的每个元组值。

然后,reduce() 函数可以通过 operator.mul 函数按索引迭代元组的每个元素以获取输出。

方法 4:使用列表推导式和 numpy.prod()

列表推导式在许多问题中被大量使用。就像我们必须迭代和解包元组一样,在最后三种方法中,列表推导式将在这里帮助我们。让我们迭代字典中所需索引处的元组。numpy 库的 prod 方法将计算乘积。

示例

import numpy as np

# dictionary with tuples as values
inputDict = {'a': (1, 3, 5, 7), 'b': (2, 4, 6, 8), 'c': (2, 3, 5, 7)}

# the original dictionary
print("Input dictionary: ", inputDict)

result = tuple(np.prod([inputDict[key][i] for key in inputDict]) for i in range(len(inputDict[list(inputDict.keys())[0]])))

# result
print("Output: ", result)

输出

Input dictionary:  {'a': (1, 3, 5, 7), 'b': (2, 4, 6, 8), 'c': (2, 3, 5, 7)}
Output:  (4, 36, 150, 392)

因此,我们迭代了字典值中元组的每个索引。然后,我们使用列表和列表推导式来迭代所有匹配的索引。最后,prod 给我们乘积。

方法 5:使用递归方法

递归方法也可用于计算每个索引处元组元素的乘积。尽管对于较大的数据集而言,这种方法可能不是最有效的,但它对于教育目的很有用。

示例

def prodTup(inp):
   res = 1
   for ele in inp:
      res *= ele
   return res

def recursive_product(tuples_dict, index=0):
   if index >= len(next(iter(tuples_dict.values()))):
      return ()
   return (prodTup(tuple(tuples_dict[key][index] for key in tuples_dict)),) + recursive_product(tuples_dict, index + 1)

inputDict = {'a': (1, 3, 5, 7), 'b': (2, 4, 6, 8), 'c': (2, 3, 5, 7)}
result = recursive_product(inputDict)
print("Output: ", result)

输出

Output:  (4, 36, 150, 392)

结论

根据索引获取存储在 Python 字典中作为值的元组元素的乘积,可以使用上面讨论的各种方法来实现。每种方法都提供了实现所需结果的方法,根据特定需求或边界提供灵活性和选择。因此,始终为更多方法的出现留有广阔的空间。

重要的是要理解每种方法的实现和逻辑,以便迭代字典值作为元组,然后迭代元组本身。必须将正确的索引与其值映射起来才能实现乘积。

更新于: 2023年11月2日

132 次浏览

开启您的 职业生涯

通过完成课程获得认证

立即开始
广告