2014-11-10 3 views
1

У меня есть задача, которая должна быть прямой. У меня очень большой файл данных, из которого я хочу извлечь только определенные данные. То, что я хочу сделать в начале, - это прочитать в двух столбцах, назовите их массой и snapnum, разделите первый элемент массой пополам, затем перейдите к остальной части списка, и если будет найден этот номер mass/2, добавьте, что новый список, а также соответствующий элемент в списке snapnum.Создание списка после предварительной операции над каждым элементом списка сепататов

Мой тест данных выглядит следующим образом:

///HEADER 
1000 400 
100  50 
200  300 
800  400 
50  25 
100  300 
500  100 
400  200 

Результаты I планирующим являются

500 100 
    50 25 
100 300 
400 200 

Моя попытка на код

MASS = [] 
    MASS2 = [] 
    SNAPNUM = [] 

for line in nlines:    #Loop Strips empty lines as well as replaces   tabs  with space 
    if line !='': 
    line = line.strip() 
    line = line.replace('\t',' ') 
    columns = line.split() 
    snapnum = columns[1] 
    mass = float(columns[0]) 
    mass2 = mass/2.;print(mass/2) #divide element in mass by half. 
    if mass == mass2:  
    MASS2.append(mass2) 
    SNAPNUM.append(snapnum) 
    continue 

print(MASS2) 
print(SNAPNUM) 

Результаты я получаю

500.0 
    50.0 
    100.0 
    400.0 
    25.0 
    50.0 
    250.0 
    200.0 
    [] 
    [] 

Кажется, что списки MASS2 и SNAPNUM не добавляются. Если я изменю условие на if mass <= mass2, я получаю список, но результаты не те, что я хочу сверху. Кажется, что код просто прокручивается и делит весь список одновременно, а не на разделение одного элемента за раз. Спасибо за помощь.

+0

'if mass == mass2' эффективно эквивалентно' if mass == mass/2.0'. Поэтому мне не очень удивительно, что ваши списки пустые. Потому что 500 не равен 250, 50 не равно 25, 100 не равно 50 ... и т. Д. – Kevin

+0

Кроме того, это ваш фактический отступ? Один пробел перед 'для строки в nlines:' и нулевые пробелы перед 'if line! = '':'? Похоже, что это должно произойти с «IndentationError». – Kevin

+0

Отступы отбрасываются в копии и вставляются. – Surfcast23

ответ

0

Я понял, что все, что мне нужно, это вложенная петля, индексированная правильно для цикла.

for line in nlines:   
    if line !='': 
    line = line.strip() 
    line = line.replace(',',' ') 
    columns = line.split() 
    snapnum = columns[8] 
    mass = float(columns[6]) 
    MASS.append(mass) 
    mass2 = mass/2 
    MASS2.append(mass2) 
    SNAPNUM.append(snapnum) 
    for i in range(N): 
     for j in range(i,N): 
      if (-0.2)*MASS2[i] <= MASS[j] <= (0.2)*MASS2[i]: 
      MASS3.append(MASS2[i]) 
      SNAPNUM2.append(SNAPNUM[j]) 

Я просто боюсь, что это не самый эффективный способ делать что-то.

Смежные вопросы