python - 在两个列表中搜索项目

标签 python list loops

我在 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_SARMList2中不存在。然后可以从 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/

相关文章:

c++ - 在列表迭代器中设置下一个对象

python - 在元素之间添加逗号

android - 转换为 ArrayList<?在 onSaveInstanceState 中保存 List 时扩展 Parcelable>

php - 一种跳过已经显示的行的方法

Python Rainfall程序TypeError : unsupported operand type(s) for +: 'int' and 'str'

css - 水平显示 UL 列表

php - 如何停止或摆脱 Twig 循环?

python - 如果值不存在,则从 python 向 key=value 添加值

python - 如何在 Python 中读取给定像素的 RGB 值?

python - 使用具有相应替换项的另一个 pandas df 替换 pandas 列中的值