словарь переменных списка Python - PullRequest
0 голосов
/ 23 сентября 2018

Ниже я пытаюсь прочитать файл и сохранить каждую вторую и третью строки.У меня 4000 строк, но есть шаблон из 4 строк, который повторяется 1000 раз.После того, как я прочитал и разделил строки на три переменные x,y,z.Но это строковые переменные.Следующий цикл for Я пытаюсь преобразовать списки в массивы.Я использую словарь для этого.Однако в конце кода при печати тип y все еще является переменной str.Как я понимаю из того, что происходит, Python не хранит массив NumPy p как y, хотя я зацикливаюсь на x,y,z

#!/usr/bin/env python

import numpy as np
import matplotlib.pyplot as plt

fl = open('input.sis','r')

lines = []
x = []
y = []
z = []
for i in range(1000):
   line = []
   for j in range(4):
      f= fl.readline()
      line.append(f)
   lines.append(line)

   xyz = lines[i][2].split(' ')
   x.append(xyz[0])
   y.append(xyz[1])
   z.append(xyz[2])
fl.close()

dic = {'x':x,'y':y,'z':z}
for k in dic:
    p = dic[k]
    p = np.asfarray(p)
    print(type(p))
print(type(y[0]))

Любая идея, как заставить Python распознавать, что p = np.asfarray(p)на самом деле y = np.asfarray (y) и когда я печатаю тип y в конце, чтобы быть float вместо str?Ваша помощь будет высоко оценена!

Ответы [ 3 ]

0 голосов
/ 24 сентября 2018
for k in dic:
    p = dic[k]
    p = np.asfarray(p)
    print(type(p))

Должно быть

for k in dic:
    p = dic[k]
    dic[k] = np.asfarray(p)
    print(type(p))

Когда вы устанавливаете p = dic[k], вы звоните dic[k] и получаете значение сейчас, так как dic[ x ] == x сейчас p == x.Теперь, когда вы пытаетесь присвоить это значение соответствующему ключу, который вы хотите вызвать dic[k] = np.asfarry(p), это переводится в dic['x'] = np.asfarry(x), и теперь оно присваивается значению для соответствующего ключа.

Вот визуальный элемент, который нужно разбитьэто вниз, что происходит

dicta = {'a': 1 }

for k in dicta:
    print(dicta[k])
    p = dicta[k]
    print(p)
    dicta[k] = 3*p

print(dicta[a])
1
1
3
0 голосов
/ 24 сентября 2018
    for i in range(1000):
       line = []
       for j in range(4):
          f= fl.readline()
          line.append(f)
       lines.append(line)

       xyz = lines[i][2].split(' ')
       x.append(xyz[0])
       y.append(xyz[1])
       z.append(xyz[2])
    fl.close()

    dic = {'x':x,'y':y,'z':z}
    for k in dic:
        p = dic[k]
        p = np.asfarray(p)
        print(type(p))
    print(type(y[0]))

Ответ на заданный мной вопрос заключается в использовании globals().Некоторые люди отговаривают вас использовать его, но это единственное решение, которое я могу найти.Позвольте мне объяснить: прямо в первом цикле for y.append(xyz[1]) вернет y в виде списка <str>, где то же самое верно для x и z.Шаг 2. Я создаю словарь этих переменных x, y и z и их значений.Шаг 3. Я хочу перебрать каждую переменную в dic и изменить тип x, y, z из списка str на массивы numpy.Поэтому, когда я печатаю тип y[0], он все равно str.Теперь, если второй цикл заменен на:

dic = {'x':x,'y':y,'z':z}
for k in sorted(dic):
    globals()[k] = np.asfarray(dic[k])
print(type(y[0]))

Я получаю за type(y[0]): <type 'numpy.float64'>

0 голосов
/ 23 сентября 2018

Чтобы понять, что происходит, нужно заменить = на is now a name for.

То, что вы делаете в цикле:

  • p теперь имядля dic[k]
  • p теперь имя для вывода np.asfarray(p)

и т. д. в каждом цикле.Когда вы выходите из цикла for, p относится к выводу np.asfarray(dic('z')).И это все, что здесь произошло.

Если вы хотите обновить значения в вашем dict, вы должны сделать:

dic = {'x':x,'y':y,'z':z}
for k in dic:
    dic[k] = np.asfarray(dic[k])

или, немного лучше:

for key, value in dic.items():
    dic[key] = np.asfarray(value)

Теперь, dic['y'] refers to the array returned by np.asfarray`

Но вы ничего не сделали с y, поэтому он по-прежнему ссылается на тот же объект, что и раньше.Если вы хотите изменить это, вы должны написать что-то вроде y = ....

Вы можете, например, сделать:

y = dic['y']

Для более подробного объяснения взгляните на Фактыи мифы об именах и значениях Python

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