将列表中的条目与另一个列表进行比较
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
解释:
- 首先我们迭代
b
,所以我们在第一次迭代中有 el = ['Lettuce', 'Apple', 'eggs']
。
- 接下来我们创建布尔列表:
[x in a for x in el]
。我们检查当前元素 el
中是否有 a
的元素: [False, True, False]
- 对于 b
. 的第一个元素
- 接下来我们使用
any()
将布尔值列表 ([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')
使用 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
解释:
- 首先我们迭代
b
,所以我们在第一次迭代中有el = ['Lettuce', 'Apple', 'eggs']
。 - 接下来我们创建布尔列表:
[x in a for x in el]
。我们检查当前元素el
中是否有a
的元素:[False, True, False]
- 对于b
. 的第一个元素
- 接下来我们使用
any()
将布尔值列表 (
[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')