разница в ссылках между использованием 'in range ()' и использованием 'element in elements' внутри цикла for в python3 - PullRequest
0 голосов
/ 03 июля 2018

Я сейчас читаю dummy.txt, содержимое показывается ниже:

8t1080 0.077500 0.092123 -0.079937
63mh9j 0.327872 -0.074191 -0.014623
63l2o3 0.504010 0.356935 -0.275896
64c97u 0.107409 0.021140 -0.000909

Теперь я читаю его, используя python, как показано ниже:

lines = open("dummy.txt", "r").readlines()

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

for line in lines:
    line = line.split()
    for x in range(1, len(line)):
        line[x] = float(line[x])

Интересно, что это не работает, так как

for line in lines:
    line = line.split()

фактически не разделит строку и не изменит прочитанные данные (переменная строк, если быть точным).

Между тем, ниже работает и успешно изменяет прочитанные данные (переменная строк).

for x in range(0, len(lines)):
    lines[x] = lines[x].split()
    for x in range(1, len(line)):
        line[x] = float(line[x])

Так в чем же разница между двумя циклами for, которые имеют два разных результата?

Ответы [ 3 ]

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

Вам просто нужна структура данных для вывода для первого примера, т.е.

data = []
lines = open("dummy.txt", "r").readlines()
for line in lines:
    line = line.split()
    for x in range(1, len(line)):
        line[x] = float(line[x])
    data.append(line)

Список данных будет содержать то, что вы хотите.

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

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

aux=[]
for line in lines: #here the program changes the value of line
    line = line.split() # here you change the value of line
    for x in range(1, len(line)):
        line[x] = float(line[x])
    aux.append(line)

используя вспомогательную переменную, вы можете "сохранить" ваши значения для последующего использования

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

Вы бы очень выиграли от pandas в этом случае:

import pandas as pd

df = pd.read_csv('dummy.txt', sep=' ', header=None)

>>> df.values

array([['8t1080', 0.0775, 0.092123, -0.079937],
       ['63mh9j', 0.327872, -0.074191, -0.014622999999999999],
       ['63l2o3', 0.5040100000000001, 0.356935, -0.27589600000000003],
       ['64c97u', 0.10740899999999999, 0.02114, -0.000909]], dtype=object)

Или все за один раз (без сохранения вашего текстового файла в качестве объекта данных):

my_array = pd.read_csv('dummy.txt', sep=' ', header=None).values

>>> my_array
array([['8t1080', 0.0775, 0.092123, -0.079937],
       ['63mh9j', 0.327872, -0.074191, -0.014622999999999999],
       ['63l2o3', 0.5040100000000001, 0.356935, -0.27589600000000003],
       ['64c97u', 0.10740899999999999, 0.02114, -0.000909]], dtype=object)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...