Составьте список динамического словаря 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 оператор, чтобы открыть файл, который закроет файл в конце блока.

как еще альтернативный и более pythonic способ вы также можете использовать 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 принимает аргумент разделителя и возвращает целые строки, разделенные в одном итераторе, вам не нужно перебирать файл и разбивать его вручную.

и если вы хотите сохранить порядок, вы можете использовать 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')])]

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

попробуй:

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

для более чистого кода, Вы можете использовать функцию 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'}

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