Удалить уникальные элементы списка среди многих списков

1

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

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']
  • 0
    Не могли бы вы показать, какой результат вы хотите и что вместо этого возвращает ваш код? Это может помочь лучше понять проблему.
  • 0
    Пожалуйста, приведите лучшие примеры
Показать ещё 4 комментария
Теги:
list
loops

4 ответа

1
Лучший ответ
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']
  • 0
    Из любопытства, зачем использовать дикт в этом понимании списка? +1 для питона как черт :)
  • 0
    Это не диктат, а набор. От docs.python.org/3/tutorial/datastructures.html#sets : Аналогично списочным представлениям, поддерживаются также определенные наборы: >>> >>> a = {x для x в 'abracadabra', если x не в 'abc '} >>> a {' r ',' d '}
Показать ещё 8 комментариев
1

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

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
    Я считаю, что нужно фильтровать только db , а не ps
0

вы можете создать временный список с разборными ключами из 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
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)}]

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню