Python 在多个列表中删除列表的唯一项

Python 在多个列表中删除列表的唯一项,python,list,loops,Python,List,Loops,我有这些清单,它们都是正确的。需要纠正的情况在问题末尾的解释部分 ps ['C:\\Users\\user\\Desktop\\sa\\43001\\PST\\PST.shp', 'C:\\Users\\user\\Desktop\\sa\\43003\\PST\\PST.shp'] ps ['C:\\Users\\user\\Desktop\\sa\\43001\\PST\\PST.shp', 'C:\\Users\\user\\Desktop\\sa\\43003\\PST\\PST.

我有这些清单,它们都是正确的。需要纠正的情况在问题末尾的解释部分

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

我想比较这些列表,如果其中一个列表中有一个项目是唯一的,即编号为43001的[-3]位置是唯一的,则应删除该项目。最后,应只保留具有相同编号项目的对

我该怎么做

我的代码:

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

如果列表是这样的:

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

ps
 ['C:\\Users\\user\\Desktop\\sa\\43001\\PST\\PST.shp',
 'C:\\Users\\user\\Desktop\\sa\\43003\\PST\\PST.shp']
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]

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']
过滤的\u db=[i代表db中的i,如果i.split('\\')[-3]在{j.split('\\')[-3]中代表ps中的j]
打印(已过滤的\u db)
#['C:\\Users\\user\\Desktop\\sa\\43001\\DBOUND\\DBOUND.shp',
#'C:\\Users\\user\\Desktop\\sa\\43003\\DBOUND\\DBOUND.shp']
过滤的\u ps=[i表示ps中的i,如果i.split('\\')[-3]表示{j.split('\\')[-3]表示db中的j}]
打印(已过滤)
#['C:\\Users\\user\\Desktop\\sa\\43001\\PST\\PST.shp',
#'C:\\Users\\user\\Desktop\\sa\\43003\\PST\\PST.shp']

您可以使用从
ps
解析的键创建一个临时列表,然后根据键创建过滤的
db

parse_key = lambda s: s.split('\\')[-3]

ps = ['C:\\Users\\user\\Desktop\\sa\\43001\\PST\\PST.shp',
      'C:\\Users\\user\\Desktop\\sa\\43003\\PST\\PST.shp']
ps_key = [parse_key(s) for s in ps]
print (ps_key)  # ['43001', '43003']

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']
db_key = [parse_key(s) for s in db]
print (db_key)  # ['43001', '43003', '43009']

db_new = [s for s in db if parse_key(s) in ps_key]
print (db_new)

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

ps
 ['C:\\Users\\user\\Desktop\\sa\\43001\\PST\\PST.shp',
 'C:\\Users\\user\\Desktop\\sa\\43003\\PST\\PST.shp']
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]
希望这有帮助

new_list = [i for i in max(lists, key=len) if i.split('\\')[-3] in {j.split('\\')[-3] for j in min(lists, key=len)}]
这将使更大的列表变得更均匀,不管它是哪一个,最终两者都将拥有相同数量的元素(具有相同的ID)


注意:只有在问题本身中有两个列表时才有效。

能否显示您想要的结果以及代码返回的内容?这有助于更好地理解这个问题。请给出更好的示例不完全熟悉Python,但是
list(zip(ps,db)
不应该是
list(zip(ps,db))
?您想要2的交叉点吗lists@bigbounty仅基于[-3]中的数字出于好奇,为什么要在列表理解中使用dict?+1代表pythonic:)这不是dict,而是set。发件人:与列表理解类似,还支持集理解:>>>>>>a={x for x in'Abracadbra'中,如果x不在'abc'}>>>a{'r','d}他想从两个列表中删除具有唯一ID的路径?因此,当列表中有很多项,并且不知道两个列表中哪一个包含需要删除的额外项时,我们如何使用筛选操作来处理这两个列表?@RishabhAgrahari不知道。如果同时从这两个角度出发,则在
ps
上应用similay操作,我认为应该只过滤
db
,而不是
ps
new_list = [i for i in max(lists, key=len) if i.split('\\')[-3] in {j.split('\\')[-3] for j in min(lists, key=len)}]