Python列表变量字典

时间:2018-09-23 18:55:44

标签: python dictionary variables

下面,我尝试读取文件并每隔第二和第三行存储一次。 我有4000行,但是有4行重复1000次的模式。 在阅读并将行分成三个变量x,y,z之后。但是这些是字符串变量。下一个for循环,我试图将列表转换为numpy数组。为此,我使用字典。但是,在我打印代码的末尾,y的类型仍然是str变量。据我了解,尽管我循环了p

,但python并未将numpy数组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的类型时是floatstr中?非常感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

一种了解发生情况的方法是将=替换为is now a name for

您在循环中所做的是:

  • p现在是dic[k]的名称
  • p现在是np.asfarray(p)的输出的名称
在每个循环中

等等。当您离开for循环时,p指向np.asfarray(dic('z'))的输出。这就是这里发生的一切。

如果要更新字典中的值,则应该执行以下操作:

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']

有关更详尽的解释,请查看Facts and myths about Python names and values

答案 1 :(得分:0)

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

答案 2 :(得分:0)

    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>的列表,其中xz的情况相同。 步骤2.我创建了这些变量xyz及其值的字典。 步骤3.我想遍历dic中的每个变量,并将x列表中的yzstr的类型更改为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'>