[英]Python List: Pythonic way to get unique items in given List from a given Set
我有一個列表,其中可能/可能不包含重復的元素。 給定另一個元素列表/集合,我需要該列表中存在的所有唯一元素的列表。
Input:
input_list = ['android', 'ios', 'android', '', 'none', 'android', 'junk_os']
os_list = ['android', 'ios', 'windows']
Output:
output = ['android', 'ios']
什么是最有效的Python方式? 給定列表的長度可能在10左右,而Os_list固定為3。但是此行將被迭代10000次以上。
您可以使用集來執行此操作
set(os_list).intersection(input_list)
編輯由於os_list是固定的,因此您也可以將其存儲為一組:
os_list = {'android', 'ios', 'windows'}
# then it's a little less work to do each time in the loop
output = os_list.intersection(input_list)
剖析
# me
os_set = {'android', 'ios', 'windows'}
%timeit os_set.intersection(input_list)
# 1000000 loops, best of 3: 323 ns per loop
# vks
os_list = ['android', 'ios', 'windows']
%timeit [i for i in os_list if i in input_list]
# 1000000 loops, best of 3: 550 ns per loop
使用Padraic Cunningham的方法,您可以避免函數查找並從中獲得更多性能。 作為獎勵,它最終看起來像一個有意義的函數名稱。
os_set = {'android', 'ios', 'windows'}
unique_valid_devices = os_set.intersection
%timeit output_list = unique_valid_devices(input_list)
1000000 loops, best of 3: 290 ns per loop
List = ['android', 'ios', 'android', '', 'none', 'android']
OS_list = ['android', 'ios', 'windows']
y=set(List)
print [i for i in OS_list if i in y]
您可以在此處使用set
O(1)
。
最快的是(對於具有600-700個元素的較小List
)
List = ['android', 'ios', 'android', '', 'none', 'android']
OS_list = ['android', 'ios', 'windows']
[i for i in OS_list if i in List]
時間檢查:
s1="""List = ['android', 'ios', 'android', '', 'none', 'android']
OS_list = ['android', 'ios', 'windows']
[i for i in OS_list if i in List]"""
s2="""List = ['android', 'ios', 'android', '', 'none', 'android']
OS_list = ['android', 'ios', 'windows']
set(List).intersection(OS_list)"""
print timeit.timeit(stmt=s1,number=1000)
print timeit.timeit(stmt=s2,number=1000)
輸出:
0.000895947527903
0.00130528204537
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.