我需要知道我是否可以優化我的代碼,因為我覺得可以。
這里的背景關系:
list1 = [[1,'name1'], [2,'name2'], [3,'name3']]
list2 = [2,3]
for item in list1:
if item[0] not in list2:
list1.remove(item)
要獲得 list1,我正在這樣做:
list(filter(lambda x: name in x[1].lower(), list_of_items))
所以我在問是否真的可以優化這段代碼?
更新:
問我不能在 lmbda 過濾器中直接使用 list2 因為我正在使用它:
list2 = set(item[0] for item in list1) - set(object.id for object in list_in_my_bdd)
uj5u.com熱心網友回復:
這看起來非常像字典查找的作業,它可能比 O(N^2) 串列比較快。因此,如果您想要list1包含其鍵的所有條目,list2并且可以假設其中的鍵list_of_items是唯一的,您可以執行以下操作:
list1 = [[1,'name1'], [2,'name2'], [3,'name3']]
dict1 = dict(list1)
list2 = [2,3]
result = [dict1[k] for k in list2]
這需要包含在串列 2 中的所有鍵實際上都在串列 1 中。否則里面會有None值result
定時:
要在筆記本中重現計時:
import numpy as np
list1 = [[i, f"name{i}"] for i in range(10000)]
list2 = np.random.choice(range(10000), 1000).tolist()
dict1 = dict(list1)
%timeit [dict1.get(k) for k in list2]
%timeit [item for item in list1 if item[0] in list2]
>>>10000 loops, best of 5: 141 μs per loop
>>>10 loops, best of 5: 160 ms per loop
所以字典查找比串列理解快大約 1000 倍。
正如@Paul 提到的,如果list1可以直接使用字典替換的設定,這只會更快:
import numpy as np
list_of_items = [(j, f"name{i}") for j, i in enumerate(np.random.randint(0, 50000, 10000))]
list1 = list(filter(lambda x: "name" in x[1].lower(), list_of_items))
dict1 = dict(filter(lambda x: "name" in x[1].lower(), list_of_items))
uj5u.com熱心網友回復:
您可以改用串列推導式,并且只包含list1其第一個元素在的子串列list2:
[item for item in list1 if item[0] in list2]
uj5u.com熱心網友回復:
串列理解和集合呢?
list1 = [[1,'name1'], [2,'name2'], [3,'name3']]
good = {2,3}
print([[a,b] for a,b in list1 if a in good])
# [[2, 'name2'], [3, 'name3']]
uj5u.com熱心網友回復:
你可以這樣做。請注意,變數名稱與您的問題中的名稱相同,但 list2 實際上是一個集合(為了效率)。
list1 = [[1,'name1'], [2,'name2'], [3,'name3']]
list2 = {2, 3}
list3 = [item for item in list1 if item[0] in list2]
print(list3)
uj5u.com熱心網友回復:
要獲得 list1,我正在這樣做:
list(filter(lambda x: name in x[1].lower(), list_of_items))
你為什么不在這里也包括支票:
list(filter(lambda x: name in x[1].lower() and x[0] in list2, list_of_items))
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/382221.html
上一篇:如何從包含getter中的int變數的List<class>填充List<int>
下一篇:遞回地重命名字典串列中的字典鍵
