Python - 唯一值乘积


Python 中的列表允许重复项,也就是说,我们可以在列表中两次拥有相同的值。这在大多数情况下很有用,但有时需要删除重复元素以执行某些操作。在本文中,我们将重点介绍如何提取整数列表中唯一的元素(去除重复元素),并找到它们的乘积。它具有广泛的用例场景,我们将尝试讨论所有可能生成输出的方法。

方法 1:集合实现

Python 中的集合是可迭代、可变的无序数据集合,但没有重复元素。因此,这可以帮助我们从列表中获取唯一的数据集。set() 函数帮助我们实现相同的功能。让我们开始编码。

示例

def prodUniq(listEnter):
   res = 1
   for item in listEnter:
      res *= item
   return res

#initial list
userList = [24, 15, 24, 41, 22, 11, 11, 51]
#unique list
uniqList = list(set(userList))
#product output
res = prodUniq(uniqList)

print("User entered list: ",userList)
print("Unique Values List: ",uniqList)
print("Unique Values Multiplication: ",res)

输出

User entered list:  [24, 15, 24, 41, 22, 11, 11, 51]
Unique Values List:  [41, 11, 15, 51, 22, 24]
Unique Values Multiplication:  182167920

方法 2:使用另一个列表

现在,我们将尝试在没有其他数据集合(而是列表)的帮助下获取乘积。我们将借助一个空列表来过滤唯一的元素,然后找到乘积。让我们保持乘积函数不变。

示例

def prodUniq(listEnter):
   res = 1
   for item in listEnter:
      res *= item
   return res

#initial list
userList = [24, 15, 24, 41, 22, 11, 11, 51]
#unique list generation
uniqList = []
for item in userList:
   if item not in uniqList:
      uniqList.append(item)

res = prodUniq(uniqList)

print("User entered list: ",userList)
print("Unique Values List: ",uniqList)
print("Unique Values Multiplication: ",res)

输出

User entered list:  [24, 15, 24, 41, 22, 11, 11, 51]
Unique Values List:  [24, 15, 41, 22, 11, 51]
Unique Values Multiplication:  182167920

一种简单的方法,我们迭代现有的列表以检查任何项目是否存在于空唯一列表中,如果不存在则插入它。因此,我们可以轻松地过滤掉重复元素,然后将其传递到现有的乘积函数中以获取乘积。

  • 时间复杂度 − O()

  • 辅助空间 − O()

方法 3:列表推导式

列表推导式是从现有列表生成新列表的较短语法。让我们尝试使用它来获取唯一的列表。列表推导式帮助我们在这里缩短代码。

示例

def prodUniq(listEnter):
   res = 1
   for item in listEnter:
      res *= item
   return res

#initial list
userList = [24, 15, 24, 41, 22, 11, 11, 51]
#unique list generation
uniqList = [item for index, item in enumerate(userList) if item not in userList[:index]]

res = prodUniq(uniqList)

print("User entered list: ",userList)
print("Unique Values List: ",uniqList)
print("Unique Values Multiplication: ",res)

输出

User entered list:  [24, 15, 24, 41, 22, 11, 11, 51]
Unique Values List:  [24, 15, 41, 22, 11, 51]
Unique Values Multiplication:  182167920
  • 时间复杂度 − O()

  • 辅助空间 − O()

方法 4:使用 Counter

在 collections 模块中,我们有一个字典子类,专门用于计算散列值。Counter 将值存储为键,并将它们的计数存储为字典中的值。我们可以借助键来获取唯一的列表。

示例

from collections import Counter

def prodUniq(listEnter):
   res = 1
   for item in listEnter:
      res *= item
   return res

#initial list
userList = [24, 15, 24, 41, 22, 11, 11, 51]

#count dictionary generated by counter
counterDict = Counter(userList)

#unique list generation
uniqList = counterDict.keys()

res = prodUniq(uniqList)

print("User entered list: ",userList)
print("Counter generated dict: ",counterDict)
print("Unique Values List: ",uniqList)
print("Unique Values Multiplication: ",res)

输出

User entered list:  [24, 15, 24, 41, 22, 11, 11, 51]
Counter generated dict:  Counter({24: 2, 11: 2, 15: 1, 41: 1, 22: 1, 51: 1})
Unique Values List:  dict_keys([24, 15, 41, 22, 11, 51])
Unique Values Multiplication:  182167920

输出清楚地显示了 Counter() 函数实际上做了什么。我们巧妙地利用了 Counter 生成的字典中的键,因为它们表示列表中的唯一值,并忽略了它们的计数(值对)。然后是我们的简单乘积函数。

  • 时间复杂度 − O()

  • 辅助空间 − O()

方法 5:使用字典跟踪出现次数

可以使用字典来跟踪列表中每个元素。通过迭代列表并更新字典,我们可以获取列表中的唯一值并生成它们的乘积。它类似于计数器方法,只是排除了内置函数。

示例

def prodUniq(listEnter):
   res = 1
   #dictionary to keep track of each item
   emptyDict = {}
   for item in listEnter:
      if item not in emptyDict:
         emptyDict[item] = 1
         res *= item
      return res

#initial list
userList = [24, 15, 24, 41, 22, 11, 11, 51]
#product
res = prodUniq(userList)

print("User entered list: ",userList)
print("Unique Values Multiplication: ",res)

输出

User entered list:  [24, 15, 24, 41, 22, 11, 11, 51]
Unique Values Multiplication:  182167920
  • 时间复杂度 − O()

  • 辅助空间 − O()

方法 6:使用 NumPy

NumPy 是一个非常流行的库。它包含在统计和科学计算中广泛使用的强大工具。NumPy 中的 unique 和 prod 函数帮助我们轻松获得乘积输出。

示例

import numpy as np

#initial list
userList = [24, 15, 24, 41, 22, 11, 11, 51]

#unique list
uniqList = np.unique(userList)

#product
res = np.prod(uniqList)

print("User entered list: ",userList)
print("Unique list using numpy: ",uniqList)
print("Unique Values Multiplication using numpy: ",res)

输出

User entered list:  [24, 15, 24, 41, 22, 11, 11, 51]
Unique list using numpy:  [11 15 22 24 41 51]
Unique Values Multiplication using numpy:  182167920

unique 函数从现有列表生成一个非重复排序元素的列表。另一方面,prod 函数生成传递的列表中元素的乘积。

  • 时间复杂度 − O()

  • 辅助空间 − O()

方法 7:使用 itertools

Python 为我们提供了强大的 itertools 模块,其中包含有助于高效循环的工具和函数。在 itertools 库中,我们有一个 groupby() 函数,它可以帮助我们对唯一元素进行分组。在这种方法中,我们将尝试使用此函数来有效地创建唯一的列表。

示例

import itertools

#initial list
userList = [24, 15, 24, 41, 22, 11, 11, 51]

#unique list
uniqList = [key for key, group in itertools.groupby(sorted(userList))]

#product
res = 1
for item in uniqList:
   res *=item

print("User entered list: ",userList)
print("Unique list: ",uniqList)
print("Unique Values Multiplication: ",res)

输出

User entered list:  [24, 15, 24, 41, 22, 11, 11, 51]
Unique list:  [11, 15, 22, 24, 41, 51]
Unique Values Multiplication:  182167920

务必使用 sorted 以确保 groupby() 函数正常运行。itertools.groupby() 函数实际上为每个唯一键及其关联组生成 (键,组) 对。对于我们的用例,我们只需要唯一值,因此我们使用列表推导式提取每个对的键部分。一旦我们有了唯一的列表,这次我们使用一个简单的 for 循环,其中我们将列表中的每个项目乘以一个预先创建的初始化为 1 的结果值。

  • 时间复杂度 − O()

  • 辅助空间 − O()

结论

本文到此结束,但探索其他可能性才刚刚开始。上面讨论的每种方法都以不同的方式进行,并取决于我们可以实现它们的具体需求。了解 Python 中这些小技巧有助于我们未来的大型项目。

尝试实现您自己版本的上述七种方法。Python 3.8+ 中的 set 和 math.prod() 函数是我们唯一值乘积问题陈述的一行解决方案。查看它,编码愉快。

更新于: 2023-11-02

103 次查看

启动您的 职业生涯

通过完成课程获得认证

开始
广告

© . All rights reserved.