我在python中有两个列表,例如:
的List1:
('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行。
最好的方法是什么?我尝试使用for
条件嵌套两个if-else
- 循环,但我无法实现它......
任何暗示都表示赞赏......
卢卡斯
答案 0 :(得分:3)
使用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)
,而不是仅使用列表的二次方。
答案 1 :(得分:1)
使用这些list
s:
List1 = [('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')]
List2 = [('CF618_JURI70_SARM'),
('C2335_ODR70_SARM'),
('CF617_LJ370_SARM')]
您可以使用in
运算符过滤掉不需要的结果:
filtered_list = [item for item in List1 if item[0] in List2 and item[3] in List2]
或set
操作:
List2s = set(List2)
filtered_list = [item for item in List1 if len({item[0], item[3]} & List2s) == 2]
在任何一种情况下,这都给我们留下了:
>>> print(*filtered_list, sep='\n')
('CF618_JURI70_SARM', '1/1/2', '1/1/1', 'CF617_LJ370_SARM', 'Router')