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.