Доступ к списку элементов со списком индексов

Рассмотрим большой список именованных элементов (первая строка), возвращенных из большого файла csv (80 МБ) с возможным прерывистым интервалом

name_line = ['a',,'b',,'c' .... ,,'cb','cc'] 

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

 data_line = ['10',,'.5',,'10289' .... ,,'16.7','0'] 

Я попробовал это двумя способами. Один из них заполняет пустые столбцы из каждой строки прочитанного

 blnk_cols = [1,3, ... ,97] while data: ... for index in blnk_cols: data_line.pop(index) 

другой – компиляция элементов, связанных с именем из L1

 good_cols = [0,2,4, ... ,98,99] while data: ... data_line = [data_line[index] for index in good_cols] 

в данных, которые я использую, определенно будут более хорошие линии, а затем плохие строки, хотя это может быть до половины и половины.

Я использовал пакет cProfile и pstats для определения моих самых слабых ссылок в скорости, которые предполагали, что pop был текущим самым медленным элементом. Я переключился на список comp, и время почти удвоилось.

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

мне действительно нужно иметь возможность делать

 data_line = data_line[good_cols] 

эффективно передавая список индексов в список, чтобы вернуть эти элементы. Сейчас моя программа работает примерно через 2,3 секунды для файла размером 10 МБ, а поп-аккаунты – около 0,3 секунды.

Есть ли более быстрый способ доступа к определенным местоположениям в списке. В C это просто будет де-ссылкой на массив указателей на правильные индексы в массиве.

Дополнения: name_line в файле перед чтением

 a,b,c,d,e,f,g,,,,,h,i,j,k,,,,l,m,n, 

name_line после чтения и разделения (",")

 ['a','b','c','d','e','f','g','','','','','h','i','j','k','','','','l','m','n','\n'] 

One Solution collect form web for “Доступ к списку элементов со списком индексов”

Попробуйте выражение генератора,

 data_line = (data_line[i] for i in good_cols) 

Также читайте здесь, в разделе «Генерационные выражения» и «Понимание списков»

поскольку главный ответ говорит вам: «В принципе, используйте выражение генератора, если все, что вы делаете, повторяется один раз».

Поэтому вам следует воспользоваться этим.

  • Python: список сортировки с параллельным списком
  • Как удалить повторяющиеся слова из списка в python без использования наборов?
  • У Дикта есть ключ от списка
  • Замораживание в Python?
  • python суммирует значения списков списка
  • Преобразование списка в * args в Python
  • python, сортировка списка с помощью ключа, который является подстрокой каждого элемента
  • Как инициализировать словарь пустых списков в Python?
  • Python - лучший язык программирования в мире.