#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. Спасибо, Марк. Мой список большой, но может поместиться в памяти. Спасибо за ответ и отличное последующее объяснение.