我在 python 中有两个列表,例如:
列表1:
('C2244_LNO70_SARM', '1/1/2', '1/2/8', 'CF164_LUJ70_SAR8', 'Router')
('C1723_LN270_SARM', '1/1/1', '1/1/8', 'CF164_LUJ70_SAR8', 'Router')
('CF618_JURI70_SARM', '1/1/1', '1/2/7', 'CF164_LUJ70_SAR8', 'Router')
('CF618_JURI70_SARM', '1/1/2', '1/1/1', 'CF617_LJ370_SARM', 'Router')
('C2335_ODR70_SARM', '1/1/2', '1/1/2', 'CF693_LAC70_SARM', 'Router')
列表2:
('CF618_JURI70_SARM')
('C2335_ODR70_SARM')
('CF617_LJ370_SARM')
现在,我想以这样的方式遍历List1:如果List2中不存在column0或column3的值,则应删除该记录。
例如,在List1(4,3)
中,值CF693_LAC70_SARM
在List2
中不存在。然后可以从 List1 中删除第 4 行。
最好的方法是什么?我尝试用 if-else
条件嵌套两个 for
循环,但我无法实现它......
任何提示表示赞赏...
卢卡斯
最佳答案
使用 set将元组中的所有字符串存储在 list2 中,并检查每个元组中的任一子元素是否在集合中:
l1=[('C2244_LNO70_SARM', '1/1/2', '1/2/8', 'CF164_LUJ70_SAR8', 'Router'),
('C1723_LN270_SARM', '1/1/1', '1/1/8', 'CF164_LUJ70_SAR8', 'Route'),
('CF618_JURI70_SARM', '1/1/1', '1/2/7', 'CF164_LUJ70_SAR8', 'Router'),
('CF618_JURI70_SARM', '1/1/2', '1/1/1', 'CF617_LJ370_SARM', 'Router'),
('C2335_ODR70_SARM', '1/1/2', '1/1/2', 'CF693_LAC70_SARM', 'Router')]
l2 = [('CF618_JURI70_SARM',),
('C2335_ODR70_SARM',),
('CF617_LJ370_SARM',)]
st = {t[0] for t in l2 }
# update original list
l1[:] = [t for t in l1 if t[0] in st or t[3] in st]
print(l1)
输出:
[('CF618_JURI70_SARM', '1/1/1', '1/2/7', 'CF164_LUJ70_SAR8', 'Router'), ('CF618_JURI70_SARM', '1/1/2', '1/1/1', 'CF617_LJ370_SARM', 'Router'), ('C2335_ODR70_SARM', '1/1/2', '1/1/2', 'CF693_LAC70_SARM', 'Router')]
我认为您指的是索引 0 和索引 3,即第一列和第四列。
如果 ele 0 和 ele 3 都必须存在,则使用 and:
l1[:] = [t for t in l1 if t[0] in st and t[3] in st]
这将留下一个元组,即第四个:
[('CF618_JURI70_SARM', '1/1/2', '1/1/1', 'CF617_LJ370_SARM', 'Router')]
您还可以使用 set.issuperset
来测试 t 中的每个元素是否都在 s 中:
l1[:] = [t for t in l1 if st.issuperset([t[0],t[3]])]
print((l1))
这又会只留下一个元组:
[('CF618_JURI70_SARM', '1/1/2', '1/1/1', 'CF617_LJ370_SARM', 'Router')]
一旦您的数据达到任意合理的大小,构建集合的成本将被集合提供的高效 0(1)
查找所抵消,因此您的代码将是 0(n)
与仅使用列表的二次相反。
关于python - 在两个列表中搜索项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30854440/