Удаление списка, который не соответствует определенному критерию?

#python #algorithm

#python #алгоритм

Вопрос:

Я немного запутался в том, как подойти к этой проблеме.

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

Например. скажем, я хочу сохранить только списки, в которых есть хотя бы один узел, начинающийся с 4 в следующих списках:

 ['4-7', '2-5', '2-9', '2-32', '2-16', '2-29', '2-13', '2-26', '2-20', '2-23']
['2-32', '2-31', '2-36', '2-28', '2-34', '2-43', '2-41', '2-39']
 

В этом случае я должен удалить второй и сохранить первый список. Я знаю, как определить, какие из них начинаются с 4, и я могу определить списки, которые имеют эту особенность, но не уверен, как пометить другие списки для удаления.

Каков наилучший подход? У меня много подобных списков (несколько миллионов), поэтому я пытаюсь найти наименее дорогой способ сделать это. Я думал о создании списка для сохранения списков, а затем сравнить его с исходным списком и удалить те, которых нет в обоих списках, но я стараюсь избегать слишком большого количества вложенных циклов for .

Комментарии:

1. Откуда вы пытаетесь их удалить? Файл, база данных, переменная?

2. извините, я должен был упомянуть об этом. Я создал график с узлами и ребрами (путями). Я пытаюсь удалить все неработающие пути. Итак, у меня есть список узлов, которые я могу перечислить в виде списка с помощью цикла for, и я могу видеть все ребра, которые у них есть (что я опубликовал в своем примере).

Ответ №1:

Вы можете попробовать разобраться в списке:

 result = [yourlist for yourlist in yourlists
          if any(node.startswith('4-') for node in yourlist)]
 

Или выражение генератора, если вы не хотите, чтобы все результаты были в памяти сразу:

 result = (yourlist for yourlist in yourlists
          if any(node.startswith('4-') for node in yourlist))
 

Посмотрите, как это работает онлайн: ideone

Комментарии:

1. вау .. я подумал, что это псевдокод, когда прочитал его, затем открыл вашу ссылку и понял ее реальный код. Я не знал об этих командах. Спасибо. Еще один вопрос: лучше ли использовать выражения генератора, если я делаю все это в цикле for с переменными, которые перезаписываются в каждом цикле?

2. @Lostsoul: Трудно сказать, не зная больше о вашем коде, но если входные данные представляют собой список списков, и он удобно помещается в памяти, проще всего, вероятно, использовать понимание списка и назначить его обратно yourlists , чтобы исходный список был собран мусором. Если он неудобно помещается в памяти, ответ может быть более сложным в зависимости от того, что вам нужно сделать с результатом. Выражение генератора полезно, если вы просто хотите выполнить итерацию по нему, но не так полезно, если вам нужен произвольный доступ.

3. Спасибо, Марк. Мой список большой, но может поместиться в памяти. Спасибо за ответ и отличное последующее объяснение.