从文本文件PYTHON填充字典

时间:2015-07-09 08:13:35

标签: python list loops dictionary

我正在尝试阅读此文本文件。

A B C D
1 5 6 7
2 8 9 10
3 .......
4 .......

这封信是作为一行引入的,然后我将所有值作为浮点数引入

with open('file.txt', 'r') as f:
  headings = f.readline()

  numbers = [float(n) for n in f.read().split()] #read values to the 'numbers' as a list 
  print numbers

所以我有一个很长的所有整数列表。

但我想要这种格式的字典:

my_dict( { 1: [5,6,7], 2:[8,9,10] } )

所以第一列文件编号是键,其余的是与其各自键相关的列表。

我将每个第4个值设置为带循环的键,但是如何轻松地将其余值作为列表放入相应的键中。

5 个答案:

答案 0 :(得分:4)

mydict = {}
with open('file.txt', 'r') as f:
    headings = f.readline()

    for row in f:
        row = row.split()
        key = row[0]
        vals = row[1:]
        mydict[key] = vals

那样的东西?或者我错过了理解你想要的结果? 由于你没有使用实际的标题A B C D ...,我不打算尝试用它们做些什么,所以我会保留你的解决方案。

你还写了一些名为my_dict(?)的类,我不会尝试使用它,因为我不知道它到底是什么。

如果您需要在输出中使用整数值,只需执行以下操作:

row = row.split()
row = list(int(n) for n in row)

答案 1 :(得分:0)

可以使用numpy loadtxtgenfromtxt进行阅读。要创建字典,我更喜欢dictionary comprehension。 请注意,我使用逗号作为示例文件的分隔符。

dtypes

function pageLoad(callback) { if ("function" == typeof callback) { if (document.addEventListener) { // Event that fires when the initial HTML document has been completely loaded and parsed document.addEventListener("DOMContentLoaded", callback, false); } else if (window.attachEvent) { // For IE 8 and below window.attachEvent("onload", callback); } else if ("function" == typeof window.onload) { // Event that fires when the page has fully loaded including images / scripts etc var o = window.onload; window.onload = function() { o(); callback(); }; } else { window.onload = callback; } } } 当然可以根据您的要求进行修改。

答案 2 :(得分:0)

你可以这样做:

i = iter(numbers) print [{r[0]: list(r[1:]) for r in zip(i,i,i,i)}]

答案 3 :(得分:0)

您可以使用带有生成器表达式的csv moduledict轻松完成此操作:

import csv

with open('file.txt', 'r') as f:
    next(f) # skip header
    r = csv.reader(f, delimiter=" ")
    d = dict((int(row[0]), map(int,row[1:])) for row in r)
    print(d)

{1: [5, 6, 7], 2: [8, 9, 10]}

如果您有重复键,那么您将需要另一种方法,否则您将丢失数据,collections.defaultdict将处理重复:

import csv
from collections import defaultdict
with open('file.txt', 'r') as f:
    next(f)
    d = defaultdict(list)
    r = csv.reader(f,delimiter=" ")
    for row in r:
       d[row[0]].extend(map(int,row[1:]))

如果你想在自己的dict中每四行使用一次,你可以在csv.reader对象上使用itertools.islice

import csv
from itertools import islice
with open('file.txt', 'r') as f:
    next(f) # skip header
    r = csv.reader(f, delimiter=" ")
    out = []
    for row in iter(lambda: list(islice(r, 4)),[]):
        out.append(dict((int(r[0]), map(int,r[1:])) for r in row ))

适用于:

A B C D
1 5 6 7
2 8 9 10
5 5 6 7
6 8 9 10
1 2 3 4
2 2 2 2
3 3 3 3
4 4 4 4

将输出:

[{1: [5, 6, 7], 2: [8, 9, 10], 5: [5, 6, 7], 6: [8, 9, 10]}, {1: [2, 3, 4], 2: [2, 2, 2], 3: [3, 3, 3], 4: [4, 4, 4]}]

你可以把它全部放在一个列表comp:

 out = [dict((int(r[0]), map(int,r[1:])) for r in row) 
       for row in iter(lambda: list(islice(r, 4)),[])]

答案 4 :(得分:0)

因为你需要在浮动中,如果你想知道如何在字典理解中做到这一点

  

这个答案只是对Torexed的答案的修改

with open('file.txt', 'r') as f:
    headings = f.readline()
    mydict={float(row[0]):[float(i) for i in row[1:]] for row in (rows.split(',') for rows in f)}
    print mydict