2014-01-21 4 views
0

Я пытаюсь передать словарь за пределами цикла, имея все результаты внутри него. Является ли это возможным?Можно ли передать полный dict вне цикла в другой dict

Мой код:

file_name = input('Enter a file name: ') 
f = open(file_name, 'r') 
data = f.readlines() 
final_data = [] 

for line in data: 
     values = line.split() 
     read_line = dict({ 
       'vertex': values[0], 
       'visited': values[1], 
       'letter': values[2], 
       'neighbors': values[3] 
       }) 
     final_data.append(read_line) 

print(final_data['vertex']) 

Ошибка TypeError: Список индексы должны быть целыми, не ул

Причина он показывает ошибку, что она превратила Dict в список. Теперь, когда я использую .copy() для копирования dict в final_data, он печатает только первую строку в файле. Я как-то хочу скопировать весь dict, поскольку мне нужно получить доступ к другим значениям key => позже в коде.

Мой входной файл

1 0 A 2,3 // 1 = vertex || 0 = visited || A = letter || 2,3 = neighbors 
2 0 B 1,4,5 
3 0 C 1,2 
4 0 D 2,5 
5 0 E 2,4 

Я знаю, что списки принимают только целые числа, но мне нужно как-то Сыроватского.

+4

_ "Причина он показывает ошибку, что она превратила Dict перечислить Это не звучит для меня. Когда вы делаете 'final_data = []', это означает, что 'final_data' - это список для начала. Преобразование не происходит. – Kevin

+0

Почему вы не используете «буквы» или «индексы» (первый столбец) вершин в качестве соответствующих ключей словаря и создаете только один dict вместо списка dicts? – Hyperboreus

+0

@Kevin: Я пытался копировать orignal dict, используя.скопировать и удалить final_data = [] сверху, но он скопировал только первую строку. Я хочу, чтобы весь dict был скопирован и напечатан вне цикла. Мне нужны предложения для этого. –

ответ

1

Прежде всего, вы можете сделать это много аккуратнее:

final_data = [] 
fields = ["vertex", "visited", "letter", "neighbours"] 
with open(file_name, 'r') as f: 
    for line in f: 
     final_data.append(dict(zip(fields, line.strip().split(' '))) 

во-вторых, ваш final_data список словарей, каждый из словаря в списке хранится содержимое одной строки из файла:

final_data = [{"vertex": "1", "visited": "0", 
       "letter": "A", "neighbours": "2,3"}, 
       {...}, 
       ...] 

Таким образом, чтобы получить вершину первого элемента , вам нужно индексировать список и ключа словаря:

final_data[0]["vertex"] 
+0

Получил это .. Спасибо большое :) –

1

Вы пытаетесь получить доступ к final_data в качестве словаря, но вы указали его как список с нотой []. Либо вам нужно получить доступ к нему в виде списка, либо когда вы добавите свои read_line dicts к типу final_data, чем вам нужно предоставить ключ, с помощью которого они могут быть найдены.

+0

Вы пытаетесь сказать, что я снова даю ключи к новому dict i.e final_data? Можете ли вы привести мне пример? –

+0

Вы добавляете словарь в список. Поэтому, когда вы пытаетесь получить доступ к final_data, как вы знаете, какое значение вы хотите? Вы хотите, чтобы вы ввели первый дикт? Второй? Тогда вы получите доступ к final_data [0], final_data [1] и т. Д. – FuriousGeorge

+0

О, хорошо. Виноват. Спасибо за помощь :) –

0

А что-то вроде этого, где вы установили словарную ключ к значению вершины?

final_data = dict() 
for line in data: 
     values = line.split() 
     read_line = dict({ 
       'visited': values[1], 
       'letter': values[2], 
       'neighbors': values[3] 
       }) 
     final_data[values[0]] = read_line 

print(final_data[1]) 
2

У вас есть список словарей (вы держали добавляется к нему для каждой строки в файле), а не один словарь. Следовательно,

print final_data[0]['vertex'] 

должно работать и отображать вершину с первой строки. Если вы хотите напечатать все из них вы могли бы сделать что-то вроде:

print [ d['vertex'] for d in final_data ] 

или перебрать final_data списка:

for d in final_data: 
    print d['vertex'] + '\n' 
Смежные вопросы