搜索两个列表中的项目

时间:2015-06-15 20:30:28

标签: python list loops

我在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 - 循环,但我无法实现它......

任何暗示都表示赞赏......

卢卡斯

2 个答案:

答案 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')