将列表中的条目与另一个列表进行比较

Comparing entries in a list to another list

使用 Python 3.9.5

a=['Apple', 'Orange', 'peaches']

b=[['Lettuce', 'Apple', 'eggs'],['potato', 'tomato', 'pepper']]

我想比较 a 到 b 中的任何值,如果匹配则继续下一个列表 ( 我的程序生成关键字列表)我想将初始列表“a”与我拥有的列表进行比较,如果有匹配项,则下一步,如果没有匹配项,则执行类似打印该列表的操作。

这是我尝试过的方法,但没有用

for i in b:
   if any(x in a for x in [b, c]):
      continue 
   else:
       print(#the current sublist)

我想说的是,这段代码对整数有效,但对列表或字符串无效,感谢反馈

我不知道你从哪里得到变量c。只需替换此行即可。

发件人:

if any(x in a for x in [b,c]):

收件人:

if any(x in a for x in i):

i 的值是 b 中的每个子列表,例如 ['Lettuce', 'Apple', 'eggs'] 因此您的算法迭代子列表中的每个项目并检查任何元素也是在 a.


这是对你的算法的改进。目前,您的算法 运行s 的时间复杂度为 O(z * y * x),其中:

  • x = a
  • 的长度
  • y = b
  • 的长度
  • z = b
  • 中每个子列表的平均长度

与其总是遍历列表 a,不如将其设为散列 table,例如设置,这将使搜索从线性 O(x) 改进为常数 O(1).

a_set = set(a)

for i in b:
   if any(x in a_set for x in i):
       # Do something or just continue
      continue 
   else:
       print(i)

这会将时间复杂度提高到O(z * y)。作为对比,如果我们在 a 中有 20 个元素,在 b 中有 10 个元素,并且在 b 的每个子列表中平均有 3 个元素,则先前的算法使用列表 a 将 运行 3 * 10 * 20 进行总共 600 次迭代,而一组 a 将只 运行 3 * 10 进行总共 30 次迭代。

a = ['Apple', 'Orange', 'peaches']
b = [['Lettuce', 'Apple', 'eggs'], ['potato', 'tomato', 'pepper']]

for el in b:
    if any([x in a for x in el]):
        print("ok")
    else:
        print(el)

Returns:

True
False

解释:

  1. 首先我们迭代 b,所以我们在第一次迭代中有 el = ['Lettuce', 'Apple', 'eggs']
  2. 接下来我们创建布尔列表:[x in a for x in el]。我们检查当前元素 el 中是否有 a 的元素: [False, True, False] - 对于 b.
  3. 的第一个元素
  4. 接下来我们使用 any()
  5. 将布尔值列表 ([False, True, False]) 缩减为一个布尔值

如果我正确理解了问题,那应该可以工作:

to_check = ['Apple','Orange','peaches']

list_of_lists = [['Lettuce', 'Apple','eggs'],['potato','tomato','pepper']]

for _list in list_of_lists:
    if any([element_to_check in _list for element_to_check in to_check]):
        print('Matched')
    else:
        print('Not matched')