簡體   English   中英

Python列表:從給定Set中獲取給定列表中唯一項的Python方式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM