2016-02-12 5 views
6

Ниже приведен мой набор данных из текстового файла.Составьте список динамического словаря python

2.1,3.5,1.4,0.2,Iris 
4.9,3.0,1.4,0.2,Ilia 
3.7,3.2,1.3,0.2,Iridium 

Существует список с именем:

list_of_keys 

, который имеет следующие значения в списке

['S_Length','S_Width','P_Length','P_Width','Predicate'] 

Итак, проблема, я хочу, чтобы создать список словаря для сохраните все мои данные (из текстового файла) с помощью list_of_keys as keys для словаря следующим образом:

dict = 
     {'S_Length': 2.1, 'S_Width':3.5 , 'P_Length': 1.4, 'P_Width': 0.2, 'Predicate': Iris}, 
     {'S_Length': 4.9, 'S_Width':3.0 , 'P_Length': 1.4, 'P_Width': 0.2, 'Predicate': Ilia}, 
     ... so on! 

, что у меня есть до сих пор:

# store all data from the text files as list 
all_examples = file.readlines() 

for outer_index in range(len(all_examples)): 
    for inner_index in range(0, len(list_of_keys)+1): 

ответ

4

Вы можете использовать функцию генератора, как следующее:

def func(): 
    list_of_keys = ['S_Length','S_Width','P_Length','P_Width','Predicate'] 
    with open('example.txt') as f: 
     for line in f: 
      yield dict(zip(list_of_keys,line.strip().split(','))) 

print(list(func())) 
[{'P_Width': '0.2', 'S_Length': '2.1', 'Predicate': 'Iris', 'S_Width': '3.5', 'P_Length': '1.4'}, {'P_Width': '0.2', 'S_Length': '4.9', 'Predicate': 'Ilia', 'S_Width': '3.0', 'P_Length': '1.4'}, {'P_Width': '0.2', 'S_Length': '3.7', 'Predicate': 'Iridium', 'S_Width': '3.2', 'P_Length': '1.3'}] 

вы можете прочитать файл построчно и разделить строки, а затем создать пары ключей и значений, используя функцию zip, а затем преобразуйте их в словарь.

Обратите внимание, что поскольку файловый объект является итератором, вы можете перебирать свой файловый объект и использовать оператор with, чтобы открыть файл, который закроет файл в конце блока.

В качестве другого альтернативных и более вещий образом вы можете также использовать csv модуль для чтения текстового файла:

import csv 
def func(): 
    list_of_keys = ['S_Length','S_Width','P_Length','P_Width','Predicate'] 
    with open('example.txt') as f: 
     spamreader = csv.reader(f, delimiter=',') 
     return [dict(zip(list_of_keys,row)) for row in spamreader] 

print func() 

Вот так csv.reader принимает разделители аргумент и возвращает целое ваших строк, разделенное в одном итераторе вы не» t нужно зациклиться на вашем файле и разбить его вручную.

И если вы хотите, чтобы сохранить порядок, вы можете использовать collections.OrderedDict в обоих случаях:

from collections import OrderedDict 
import csv 
def func(): 
    list_of_keys = ['S_Length','S_Width','P_Length','P_Width','Predicate'] 
    with open('example.txt') as f: 
     spamreader = csv.reader(f, delimiter=',') 
     return [OrderedDict(zip(list_of_keys,row)) for row in spamreader] 

print func() 
[OrderedDict([('S_Length', '2.1'), ('S_Width', '3.5'), ('P_Length', '1.4'), ('P_Width', '0.2'), ('Predicate', 'Iris')]), OrderedDict([('S_Length', '4.9'), ('S_Width', '3.0'), ('P_Length', '1.4'), ('P_Width', '0.2'), ('Predicate', 'Ilia')]), OrderedDict([('S_Length', '3.7'), ('S_Width', '3.2'), ('P_Length', '1.3'), ('P_Width', '0.2'), ('Predicate', 'Iridium')])] 
+1

Для О.П., который перебирает файл, используя 'range (len())' this требует _a бит больше_ объяснения. – bereal

+0

@bereal Действительно, я только что добавил. – Kasramvd

0

Если думаете, что вы должны разбить строку, используя ,, а затем с помощью namedtuple для отображения каждой строки соответственно.

2

Вам нужно всего лишь использовать split и выполнить несколько итераций.

Try:

list_of_keys = ['S_Length','S_Width','P_Length','P_Width','Predicate'] 

list_of_dict = [] 

with open('mydata.txt', "r") as f: 
    for line in f.readlines(): 
     parts = line.strip().split(",") 
     mydict = {} 
     i = 0 
     for k in list_of_keys: 
      mydict[k] = parts[i] 
      i += 1 
     list_of_dict.append(mydict) 

print list_of_dict 

Или:

list_of_keys = ['S_Length','S_Width','P_Length','P_Width','Predicate'] 

list_of_dict = [] 

with open('mydata.txt', "r") as f: 
    for line in f.readlines(): 
     parts = line.strip().split(",") 
     mydict = dict(zip(list_of_keys,parts)) 
     list_of_dict.append(mydict) 

print list_of_dict 
2

Для чистого кода, вы можете использовать функцию to_dict из панд:

import pandas as pd 

df = pd.read_csv('example.txt') 
list_of_keys = ['S_Length','S_Width','P_Length','P_Width','Predicate'] 
df.columns = list_of_keys 

dict = df.to_dict(orient='records') 

print dict[0] 
{'P_Width': '0.2', 'S_Length': '4.9', 'Predicate': 'Ilia', 'S_Width': '3.0', 'P_Length': '1.4'} 
Смежные вопросы