我有2个列表,我要在其中标识site_code
中不在host_file
中的元素。
我已经尝试了您在代码中看到的内容。
# two lists
site_list = ['4', '5', '3']
host_file = ['RTR1 site=3', 'RTR2 site=3', 'RTR1 site=5']
# empty list a with loops to add matches into it
a = []
for site_code in site_list:
for line in host_file:
if site_code in line:
a.append(line)
# another set of loops to further filter
b = []
for line in a:
if 'RTR1' in line:
b.append(line)
# attempt to print out elements in site_list that have no match in host_file
for element in site_list:
if element not in host_file:
print(element)
最后一个代码块不起作用,因为它试图匹配每个元素的整个字符串。
我希望看到屏幕上仅印有host_file
的任何元素中没有的元素'4'。
答案 0 :(得分:2)
使用迭代和set
查找:
site_list = ['4', '5', '3']
host_file = ['RTR1 site=3', 'RTR2 site=3', 'RTR1 site=5']
h_file = [y.split('=')[1] for y in host_file]
for x in site_list:
if x not in set(h_file):
print(x)
# 4
或者在创建h_file
之后,您可以进行set
的区别,从而产生set
作为输出:
set(site_list) - set(h_file)
# {'4'}
答案 1 :(得分:0)
一个简单的解决方案是在'='处分割主机字符串,并获取最后一个元素。但是,如果您想变得更强大,更通用,可以改用正则表达式模式匹配。
这是嵌入在列表理解中的简单解决方案:
hosts = [h.split(sep='=')[-1] for h in host_file]
然后在上一个循环中,将检查hosts
而不是host_file
。
答案 2 :(得分:0)
您可以使用add.apply_async((2, 2),ignore_result=True, link=add.s(16))
来获取两个集合之间的差异。
由于元素set.difference
采用不同的格式,因此您需要先处理该格式。
host_file
答案 3 :(得分:0)
In [5]: site_list = ['4', '5', '3']
In [6]: [ii.split('=')[1] for ii in host_file]
Out[6]: ['3', '3', '5']
In [7]: aa = [ii.split('=')[1] for ii in host_file]
In [8]: set(site_list)-set(aa)
Out[8]: {'4'}
In [9]: list(set(site_list)-set(aa))
Out[9]: ['4']