Прочитайте входную строку и объявите переменную с тем же именем строки, чтобы присвоить ей значение в python - PullRequest
0 голосов
/ 13 декабря 2018

Я читаю из file.txt , который содержит дискретные данные идентификаторов узлов и их соответствующих положений оси x и оси y в каждой строке:

Node_1 20.0035.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[:]

Я не нахожу правильный способ заполнить значение внутри inputlist [0] с правильнымвыбор кода Python.

Ответы [ 6 ]

0 голосов
/ 13 декабря 2018

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

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

Проверьте эту тему: Как создать переменное число переменных

0 голосов
/ 13 декабря 2018

Я думаю, что лучше использовать словарь, исходя из того, что узлы уникальны.Если узлы не уникальны, мы можем использовать список в качестве значений, но тогда у вас будет список списков в методе 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()
0 голосов
/ 13 декабря 2018

Вы рядом.Основные проблемы:

  • Вы не игнорируете первый столбец, содержащий Node_1, Node_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]]
0 голосов
/ 13 декабря 2018

Всякий раз, когда вы хотите

  • перечислять имена переменных
  • создавать переменные

вы думаете в неправильном направлении.Вместо перечисления используйте список для сбора ваших значений.Если вы хотите назвать вещи «* 1009» * полезным способом («узел1», «узел2», «узел 3» - бесполезны в том смысле, что они все еще являются узлами, которые также могут быть идентифицированы индексом), вы должны использовать словарь,Например,

cities = {}
cities['hamburg'] = ...
cities['berlin'] = ...
cities['new-york'] = ...
0 голосов
/ 13 декабря 2018

Если я правильно понимаю ваш вопрос, это должно дать вам ожидаемый результат:

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' вам понадобится - и вы в любом случае получите эти значения как nodes[xxx].Теперь, если вы хотите сохранить имена узлов, просто используйте dict вместо списка:

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[node_name] = [float(xpos), float(ypos)]
        except Exception as e:
            print("line #{} seems broken (got {})".format(lineno, e))
            continue  

print(nodes)
0 голосов
/ 13 декабря 2018

это должно сделать работу:

nodes = list()
fhand = open('file.txt','r')
for line in fhand:
    nodes.append(line.split()[1:])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...