通过理解检查其他二维列表中是否缺少列表项

Check if item of list is missing in other 2D list with comprehension

第一个列表包含带扩展名的文件名:

afiles = [['file1', '.exe'], ['file2', '.txt']]

第二个列表包含没有扩展名的文件名。例如:

bfiles = ['file1', 'file2', 'file3', 'file4']

我知道想知道a文件中缺少哪些b文件。预期结果应该是:

['file3', 'file4']

我想理解这一点。

你可以试试这个简单的列表理解:)

>>> afiles = [['file1', '.exe'], ['file2', '.txt']]
>>> bfiles = ['file1', 'file2', 'file3', 'file4']
>>> [x for x in bfiles if x not in (y[0] for y in afiles)]
['file3', 'file4']

或更好,您可以只分配 afiles 没有扩展名的文件,例如

>>> afiles_names = [x[0] for x in afiles]
>>> [x for x in bfiles if x not in afiles_names] # so you won't have to compute that each time
['file3', 'file4']

只检查是否在 afiles 的任何零索引中找不到 bfiles 的项目。

afiles = [['file1', '.exe'], ['file2', '.txt']]
bfiles = ['file1', 'file2', 'file3', 'file4']

result = [file for file in bfiles if not any(file == afile[0] for afile in afiles)]
['file3', 'file4']

列表理解 itertools.chain:

from itertools import chain

afiles = [['file1', '.exe'], ['file2', '.txt']]
bfiles = ['file1', 'file2', 'file3', 'file4']

print([x for x in bfiles if x not in chain.from_iterable(afiles)])
# ['file3', 'file4']

您可以使用设置方法difference():

set(bfiles).difference(i[0] for i in afiles)
# {'file4', 'file3'}