首页 > 解决方案 > 在许多列表中删除列表的唯一项

问题描述

我有这些列表是正确的,需要更正的场景在问题末尾的解释部分。

ps
['C:\\Users\\user\\Desktop\\sa\\43001\\PST\\PST.shp',
 'C:\\Users\\user\\Desktop\\sa\\43003\\PST\\PST.shp']

db
['C:\\Users\\user\\Desktop\\sa\\43001\\DBOUND\\DBOUND.shp',
 'C:\\Users\\user\\Desktop\\sa\\43003\\DBOUND\\DBOUND.shp']

我想比较这些列表,如果其中一个具有唯一的项目,则意味着 [-3] 位置是一个数字,因为 43001 是唯一的,那么应该删除该项目。最后,应该只保留具有相同数量项目的对。

我怎么做?

我的代码:

for i,v in list(zip(ps,db)):
    if i.split("\\")[-3] not in v.split("\\")[-3]:
    ps.remove(i)

解释

如果列表是这样的:

ps
['C:\\Users\\user\\Desktop\\sa\\43001\\PST\\PST.shp',
 'C:\\Users\\user\\Desktop\\sa\\43003\\PST\\PST.shp']

db
['C:\\Users\\user\\Desktop\\sa\\43001\\DBOUND\\DBOUND.shp',
 'C:\\Users\\user\\Desktop\\sa\\43003\\DBOUND\\DBOUND.shp',
 'C:\\Users\\user\\Desktop\\sa\\43009\\DBOUND\\DBOUND.shp']

应该删除带有 43009 的项目,因为它不存在于ps列表中,最终列表将如下所示:

ps
 ['C:\\Users\\user\\Desktop\\sa\\43001\\PST\\PST.shp',
 'C:\\Users\\user\\Desktop\\sa\\43003\\PST\\PST.shp']

db
['C:\\Users\\user\\Desktop\\sa\\43001\\DBOUND\\DBOUND.shp',
 'C:\\Users\\user\\Desktop\\sa\\43003\\DBOUND\\DBOUND.shp']

标签: pythonlistloops

解决方案


您可以创建一组唯一 ID。然后使用该集合检查包含唯一 ID 的路径并相应地删除它们。像这样的东西:

def get_id(path):
    return path.split('\\')[-3]

unique_ids = [get_id(path) for path in ps+db]
unique_ids = [id_ for id_ in unique_ids if unique_ids.count(id_)==1]

ps = [path for path in ps if get_id(path) not in unique_ids]
db = [path for path in db if get_id(path) not in unique_ids]

希望这可以帮助!


推荐阅读