У меня есть эти списки, которые верны, сценарий, необходимый для исправления, находится в части объяснения в конце вопроса.
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']
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']
filtered_db = [i for i in db if i.split('\\')[-3] in {j.split('\\')[-3] for j in ps}]
print(filtered_db)
# ['C:\\Users\\user\\Desktop\\sa\\43001\\DBOUND\\DBOUND.shp',
# 'C:\\Users\\user\\Desktop\\sa\\43003\\DBOUND\\DBOUND.shp']
filtered_ps = [i for i in ps if i.split('\\')[-3] in {j.split('\\')[-3] for j in db}]
print(filtered_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]
Надеюсь это поможет!
db
, а не ps
вы можете создать временный список с разборными ключами из 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)
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)}]
Это позволит выровнять более крупный список, независимо от того, какой он есть, и в конце концов будет иметь одинаковое количество элементов (с одинаковыми идентификаторами).
ПРИМЕЧАНИЕ. Работает только в том случае, если у вас есть два списка, как указано в самом вопросе.