我有一个列表,可能/可能不包含重复元素。给定另一个列表/元素集,我需要列表中列出的所有唯一元素。
Input:
input_list = ['android', 'ios', 'android', '', 'none', 'android', 'junk_os']
os_list = ['android', 'ios', 'windows']
Output:
output = ['android', 'ios']
最狡猾和最有效的方法是什么?给定列表的长度可能约为10,而Os_list固定为3.但此行将迭代10000次。
答案 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