如何在Python中使用集来查找列表成员资格?

elw*_*lwc 1 python set

鉴于:

A = [['Yes', 'lala', 'No'], ['Yes', 'lala', 'Idontknow'], ['No', 'lala', 'Yes'], ['No', 'lala', 'Idontknow']]

我想知道['Yes', X, 'No']A中是否存在,X我不关心的地方.

我试过:

valid = False
for n in A:
    if n[0] == 'Yes' and n[2] == 'No':
        valid = True
Run Code Online (Sandbox Code Playgroud)

我知道set()在这种情况下很有用.但是怎么做呢?这可能吗?或者我最好坚持原始代码?

roo*_*oot 8

如果你想检查存在,你可以['Yes', 'No'] in A:

In [1]: A = [['Yes', 'No'], ['Yes', 'Idontknow'], ['No', 'Yes'], ['No', 'Idontknow']]

In [2]: ['Yes', 'No'] in A
Out[2]: True
Run Code Online (Sandbox Code Playgroud)

为下一个案例尝试:

In [3]: A = [['Yes', 'lala', 'No'], ['Yes', 'lala', 'Idontknow'], ['No', 'lala', 'Yes'], ['No', 'lala', 'Idontknow']]

In [4]: any(i[0]=='Yes' and i[2] == 'No' for i in A)
Out[4]: True
Run Code Online (Sandbox Code Playgroud)

或者你可以定义一个小函数:

In [5]: def want_to_know(l,item):
   ...:     for i in l:
   ...:         if i[0] == item[0] and i[2] == item[2]:
   ...:             return True
   ...:     return False

In [6]: want_to_know(A,['Yes', 'xxx', 'No'])
Out[6]: True
Run Code Online (Sandbox Code Playgroud)

any(i[0]=='Yes' and i[2] == 'No' for i in A*10000) 实际上似乎比转换本身快10倍.

In [8]: %timeit any({(x[0],x[-1]) == ('Yes','No') for x in A*10000})
100 loops, best of 3: 14 ms per loop

In [9]: % timeit {tuple([x[0],x[-1]]) for x in A*10000}
10 loops, best of 3: 33.4 ms per loop

In [10]: %timeit any(i[0]=='Yes' and i[2] == 'No' for i in A*10000)
1000 loops, best of 3: 334 us per loop
Run Code Online (Sandbox Code Playgroud)