Python列表:Pythonic方法从给定的Set中获取给定List中的唯一项

时间:2015-08-12 09:39:55

标签: python performance list

我有一个列表,可能/可能不包含重复元素。给定另一个列表/元素集,我需要列表中列出的所有唯一元素。

Input: 
input_list = ['android', 'ios', 'android', '', 'none', 'android', 'junk_os']
os_list = ['android', 'ios', 'windows']
Output:
output = ['android', 'ios']

最狡猾和最有效的方法是什么?给定列表的长度可能约为10,而Os_list固定为3.但此行将迭代10000次。

2 个答案:

答案 0 :(得分:3)

您可以使用集来执行此操作

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

答案 1 :(得分:1)

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