Удалить уникальные элементы списка среди многих списков - PullRequest
0 голосов
/ 27 августа 2018

У меня есть эти списки, которые являются правильными, сценарий, который необходимо исправить, находится в объяснительной части в конце вопроса.

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']

Ответы [ 4 ]

0 голосов
/ 27 августа 2018
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)}]

Это выровняет больший список, независимо от того, какой он есть, и оба будут иметь одинаковое количество элементов (с одинаковыми идентификаторами) в конце.

ПРИМЕЧАНИЕ : работает, только если у вас есть два списка, представленных в самом вопросе.

0 голосов
/ 27 августа 2018

вы можете создать временный список с проанализированными ключами из 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)
0 голосов
/ 27 августа 2018

Вы можете создать набор уникальных идентификаторов. Затем используйте этот набор для проверки путей, содержащих уникальные идентификаторы, и соответственно удалите их. Примерно так:

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]

Надеюсь, это поможет!

0 голосов
/ 27 августа 2018
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']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...