Python 我应该使用字典进行会员资格测试吗?

Python 我应该使用字典进行会员资格测试吗?,python,python-3.x,time-complexity,Python,Python 3.x,Time Complexity,假设我有两个列表A,B,A是B的子集。如果我要解析B的点,每次我想测试一个元素是否是A的成员,将A表示为字典会比表示为列表更好吗?我这样问是因为我觉得字典的最坏情况查找时间是O(1),而数组的最坏情况查找时间是O(n) 也就是说,以下哪项在时间复杂度方面更有效 # Code 1 A = [1, 2, 3] B = [1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 1, 2, 3] for i in B: if i in A: print (i)

假设我有两个列表A,B,A是B的子集。如果我要解析B的点,每次我想测试一个元素是否是A的成员,将A表示为字典会比表示为列表更好吗?我这样问是因为我觉得字典的最坏情况查找时间是O(1),而数组的最坏情况查找时间是O(n)

也就是说,以下哪项在时间复杂度方面更有效

# Code 1
A = [1, 2, 3]
B = [1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 1, 2, 3]

for i in B:
    if i in A:
        print (i)
    else:
        print (-1)
似乎如果我上面所说的关于时间复杂性的话是真的,那么第一个代码的复杂性是O(| B | x | A |),而第二个代码的复杂性是O(| B |)。这是正确的吗

你应该用这个。它们有O(1)查找,就像dict一样,但它们不是键值对

您的代码将如下所示:

A=[1,2,3]
B=[1,2,3,4,5,6,7,8,1,2,3,4,1,2,3]
A_集=集(A)
对于B中的i:
如果我在一个集合中:
印刷品(一)
其他:
打印(-1)
或:

A={1,2,3}
...

我的印象是,字典的最坏情况查找时间为O(1),而数组的最坏情况查找时间为O(n)。
正确。(除了某些边缘情况,因此,在摊销最坏情况下O(1)查找时间更好)此外,
set
也有一个O(1)查找,因此如果您不需要键值对,
set
比dicts更有意义您应该使用
set
进行成员资格测试!这是成员资格的优化对象类型。同样,您的第二个代码是非常奇怪和迂回的检查项目是否存在的方法。您可以在中使用
来检查成员资格,即使是在dicts中也是如此。@paritossingh是的。非常感谢你们两位。
# Code 2
A = [1, 2, 3]
B = [1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 1, 2, 3]

A_dict = {}
for i in A:
    A_dict[i] = 0

for i in B:
    if i in A_dict:
        print (i)
    else:
        print (-1)