比较两个列表和字典的元素,而不显式迭代每个元素

时间:2017-06-29 20:04:03

标签: python list dictionary

我想比较两个列表中的每个元素(例如,a中的每个元素是否大于或等于同一索引中b中的每个元素),并且想知道是否存在比迭代更快的方式。 E.g。

import random
import time
a = [random.randint() for i in range(10**7)]
b = [random.randint() for i in range(10**7)]

我想知道是否有比这更快的方法:

start = time.time()
for i in range(10**7):
   if a[i] < b[i]: 
       continue
   else: 
       print('Nope')
       break
end = time.time()
print('%.100f' %(end-start))
Out:
Nope
0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

根据以下答案的建议,这是使用numpy

所花费的时间
start = time.time()
al = np.all(np.array(b) > np.array(a))
end = time.time()
print('%.100f' %(end-start))
Out:
1.6209998130798339843750000000000000000000000000000000000000000000000000000000000000000000000000000000

如何比较字典中的键?与上面相同,但我们不是比较列表的元素,而是比较字典的键。

谢谢!

4 个答案:

答案 0 :(得分:2)

如果你想比较每个成对的元素,你将不得不进行迭代,你的当前算法已经是O(n),正如评论中所指出的那样。

但是,使用生成器,可以减少操作总数。具体来说,要创建两个列表,无论谓词(a[i] < b[i])是否会失败,都会执行2 * 10 ^ 5个操作。使用生成器,您将只根据需要创建列表元素,因此没有初始的2 * 10 ^ 5成本。

import random
a = (random.randint() for _ in range(10**5))
b = (random.randint() for _ in range(10**5))

到目前为止,我们总共只执行了2次操作。

for i in range(10**5):
    if next(a) < next(b):
        continue
    else:
        print('Nope:', i)
        break

现在,我们在技术上每循环执行更多操作,但是一旦生成器耗尽(即a[i]永远不会更大的话,总运营成本将只会达到原始运行成本(使用基本列表)大于或等于b[i])。

答案 1 :(得分:1)

您可以使用numpy来执行此操作。只需将列表作为数组加载,然后比较它们。 Numpy主要用C语言编写,使得这些操作比纯Python更快

import numpy as np
import random

a = np.array([random.randint(0, 10) for i in range(10**5)])
b = np.array([random.randint(0, 10) for i in range(10**5)])

a >= b

输出:
array([False, False, False, ..., True, True, True], dtype=bool)

字典更复杂,因为它们没有订购。您可以尝试制作有序字典,获取值,然后重复使用上述方法

答案 2 :(得分:1)

import numpy as np

al = np.all(np.array(b) > np.array(a))

输出

al will be true if each element in a > each element in b
import time
import numpy as np

lst1 = [1, 2, 3, 4, 5, 6, 6]
lst2 = [4, 5, 6, 7, 8, 9, 9]
lst3 = [3, 5, 6, 6, 7, 7, 1]


def function1(a, b):
    start = time.clock()
    al = np.all(np.array(b) > np.array(a))
    print("%f" % (time.clock() - start))


def function2(a, b):
    start = time.clock()
    for i in range(7):
        if a[i] < b[i]:
            continue
        else:
            print('Nope')
            break
    print("%f" % (time.clock() - start))


function1(lst1, lst2) #0.000046
function2(lst1, lst2) #0.000002
function1(lst1, lst3) #0.000011
function2(lst1, lst3) #0.000005

O(n)更快。

答案 3 :(得分:1)

基本上,您需要迭代以从示例中的列表中检索需要比较的元素。

更好的方法是:

for x, y in zip(a,b): 
    if x < y: 
        continue  
    else: 
        print('Nope')
        break

更快的方式是:

if a > b: print("nope")

这正是您在代码中所做的工作,将a中的每个元素与b中的每个元素进行比较,如果a中的任何元素大于相应的元素b中的元素,打印"nope"并退出。这也是比较运算符的作用。