读取输入字符串并声明具有相同字符串名称的变量,以便在python中为其分配值

时间:2018-12-13 11:43:16

标签: python list

我正在从 file.txt 中读取内容,该文件具有离散的Node ID数据以及每行中各自的x轴和y轴位置:

  

Node_1 20.00 35.50

     

Node_2 77.00 21.40

     

Node_3 43.50 98.30


现在,我想读取此数据以形成python script.py 中的列表:

Node_1 = [20.00 , 35.50]

Node_2 = [77.00 , 21.40]

Node_3 = [43.50 , 98.30]

nodes = [Nodes_1, Nodes_2, Nodes_3]

所以最终,我将有一个节点的列表,例如[[20.00,35.50],[77.00,21.40],[43.50,98.30]]。

我已经使用下面的python代码尝试过它:

inputlist = list()
fhand = open('file.txt','r')
for line in fhand:
    for word in line.split():
        inputlist.append(word)    
    //Value in inputlist[0]// = [inputlist[1],inputlist[2]]
    nodes.append(inputlist[0])
    del inputlist[:]

我没有找到正确的方法来正确选择python代码来填充inputlist [0] 中的值。

6 个答案:

答案 0 :(得分:1)

我认为最好在节点是唯一的前提下使用字典。如果节点不是唯一的,我们可以使用列表作为值,但是在values()方法中您将拥有列表列表

您可以通过以下方式做到这一点:

nodes_dict = dict()
with open('file.txt','r') as f:
    for line in f:
        node_name, xpos, ypos = line.split()
        #Nodes are not unique
        if node_name in nodes_dict.keys():
            nodes_dict[node_name].append([xpos, ypos])
        else:
            nodes_dict[node_name] = [[xpos, ypos]]
        #Nodes are unique
        nodes_dict[node_name] = [xpos, ypos]

node_names = nodes_dict.keys()
node_coordinates = nodes_dict.values()

编辑

根据@bruno desthuilliers的评论,更好的解决方案:

from collections import defaultdict

nodes_dict = defaultdict()
with open('file.txt','r') as f:
    for line in f:
        node_name, xpos, ypos = line.split()
        #No check needed because defaultdict takes care of this
        #Otherwise check would be if node_name in nodes_dict
        nodes_dict[node_name].append([xpos, ypos])

node_names = nodes_dict.keys()
node_coordinates = nodes_dict.values()

答案 1 :(得分:0)

这应该可以完成工作:

nodes = list()
fhand = open('file.txt','r')
for line in fhand:
    nodes.append(line.split()[1:])

答案 2 :(得分:0)

您很近。主要问题是:

  • 您不会忽略包含Node_1Node_2等的第一列。为此,您可以通过[1:]进行索引。
  • 您需要将字符串转换为float
  • 您需要为每一行包括所有值,而不仅仅是第一行,因此无需为[0]编制索引。

这是一个示范:

from io import StringIO

file = StringIO("""Node_1 20.00 35.50
Node_2 77.00 21.40
Node_3 43.50 98.30""")

fhand = file  # use open('file.txt','r') instead of file

nodes = []
for line in fhand:
    inputlist = []
    for value in line.split()[1:]:
        inputlist.append(float(value))    
    nodes.append(inputlist)

print(nodes)

[[20.0, 35.5], [77.0, 21.4], [43.5, 98.3]]

答案 3 :(得分:0)

我还建议使用字典,当不存在重复的名称时,这是另一种选择。

text_file = open("file.txt", "r")
lines = text_file.read().splitlines()
s_lines = [ line.split() for line in lines ]

nodes = { line[0]: [float(x) for x in line[1:]] for line in s_lines }

print (nodes)
#=> {'Node_3': [43.5, 98.3], 'Node_2': [77.0, 21.4], 'Node_1': [20.0, 35.5]}

检查此主题:How do I create a variable number of variables?

答案 4 :(得分:-1)

如果我正确理解了您的问题,这应该会为您带来预期的结果:

nodes = []
with open('file.txt','r') as f:
    for lineno, line in enumerate(f, 1):
        line = line.strip()
        if not line:
            continue
        try:
            node_name, xpos, ypos = line.split()
            nodes.append([float(xpos), float(ypos)])
        except Exception as e:
            print("line #{} seems broken (got {})".format(lineno, e))
            continue  

print(nodes)

编辑:您说

  

我想首先创建以下列表:Node_1 = [20.00,35.50] Node_2 = [77.00,21.40] Node_3 = [43.50,98.30]

重点是:由于您不知道文件中将有多少个“节点”,因此您将不知道将需要多少个“ node_xxx”变量-并且您已经将这些值设为{{1 }}。现在,如果您也想保留节点名称,只需使用字典而不是列表即可:

nodes[xxx]

答案 5 :(得分:-1)

任何时候想要

  • 枚举变量名
  • 创建变量

您的思维方向错误。而不是枚举,而是使用列表来捕获您的值。如果您想以一种有用的方式命名事物(node1,node2,node3在它们仍然只是可以被索引标识的节点的意义上就没有用),那么您可以使用字典。例如

cities = {}
cities['hamburg'] = ...
cities['berlin'] = ...
cities['new-york'] = ...