Как избежать добавления пустых списков, скобок и скобок - PullRequest
0 голосов
/ 03 июня 2018

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

from __future__ import print_function
import numpy as np

log = open("out_test", "w")
log1 = open("out_test_empty", "w")

def function(kx,ky,ek,sz,ef,tol):
    lines = []
    if ((ef-tol)<ek<(ef+tol)):
        lines.append((kx,ky,sz))
#       (lines.append((kx,ky,sz)) if (kx,ky,sz) is not None else None)
    return lines


arr = []
with open('test10') as my_file:
    for line in my_file:
        ##numbers_float=map(float, line.split())
        arr.append(map(float, line.split()))
        print(function(arr[-1][0],arr[-1][1],arr[-1][2],arr[-1][3],-0.5462,0.001), file = log)
#       print(', '.join(str(d) for d in function(arr[-1][0],arr[-1][1],arr[-1][2],arr[-1][3],-0.5462,0.001)), file = log)
#       str_list = (', '.join(str(d) for d in function(arr[-1][0],arr[-1][1],arr[-1][2],arr[-1][3],-0.7,0.001)))
#       str_list = filter(None, str_list)
#       print(str_list, file =log)

#print(arr[:][:])

#import fileinput
#for line in fileinput.FileInput("test",inplace=1):
#    if line.rstrip():
#        print(line, file=log1)

Файл тестовых данных (будет около 10 ^ 7 строк):

  0.11361097E+01  0.19677992E+01 -0.54626220E+00 -0.87053581E+00
  0.11361097E+01  0.19677992E+01 -0.54626220E+00  0.87053581E+00
  0.11361097E+01  0.19677992E+01  0.22336976E+01  0.90485914E+00
  0.11361097E+01  0.19677992E+01  0.22336976E+01 -0.90485916E+00
  0.11361097E+01  0.19677992E+01  0.23120941E+01 -0.42934308E+00
  0.11361097E+01  0.19677992E+01  0.23120941E+01  0.42934308E+00
  0.11361097E+01  0.19677992E+01  0.24740033E+01 -0.98827766E+00
  0.11361097E+01  0.19677992E+01  0.24740033E+01  0.98827766E+00
  0.11361097E+01  0.19677992E+01  0.24777489E+01 -0.52602145E+00
  0.11361097E+01  0.19677992E+01  0.24777489E+01  0.52602145E+00

Что я хочу выводить в файле:

1.1361097 1.9677992 -0.87053581
1.1361097 1.9677992  0.87053581

Пока я получаю:

[(1.1361097, 1.9677992, -0.87053581)]
[(1.1361097, 1.9677992, 0.87053581)]
[]
[]
[]
[]
[]
[]
[]
[]

Итак, мои вопросы:

  • Как избавиться от добавленных пустых списков -> []?
  • Как мне избавиться от скобок и скобок?

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

1 Ответ

0 голосов
/ 03 июня 2018

Ваша функция возвращает список кортежей:

def function(kx,ky,ek,sz,ef,tol):
    lines = []
    if ((ef-tol)<ek<(ef+tol)):
        lines.append(  (kx,ky,sz)  )   # emphasis: this appends a tuple to the list
    return lines

с (kx,ky,sz), являющимся кортежем.Просто верните числа в виде чисел с плавающей запятой:

def function(kx,ky,ek,sz,ef,tol):
    if ((ef-tol)<ek<(ef+tol)):
        return [kx,ky,sz]
    # implicitly return None if your condition is not met

Если вы хотите напечатать их не как список, а как отдельные значения, перед печатью разложите список, возвращаемый function(...):

# error when decomposing None - you would have to return [] instead of None implicitly
print(* function(arr[-1][0],arr[-1][1],arr[-1][2],arr[-1][3],-0.5462,0.001), file = log)

Тем не менее вы получите новые строки / ошибки, поэтому, возможно, лучше разделить запись части на другой файл, подобный этому:

   newVals = function(arr[-1][0],arr[-1][1],arr[-1][2],arr[-1][3],-0.5462,0.001)
   if newVals: # meaning: if the function returns something, print its elements
       print(*newVals, file = log)

Приятное чтение как отлаживать небольшие программы(# 2) - можно найти по этой ссылке - python очень «дружественен к печати», иногда вам просто нужно сохранить еще несколько переменных, чтобы напечатать их и посмотреть, как получаются результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...