从文本文件PYTHON填充字典

从文本文件PYTHON填充字典,python,list,loops,dictionary,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

我正试图读入这个文本文件

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个值设置为一个带循环的键,但如何轻松地将其余值作为列表放入相应的键中

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
像这样的?还是我误解了你想要的结果? 由于您没有使用实际的头文件
abcd…
,因此我不会尝试使用它们,因此我将保留您的解决方案

您还编写了一个名为
my_dict
(?)的类,我不会尝试使用它,因为我不知道它实际上是什么

如果您需要输出值为整数,只需执行以下操作:

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

阅读可以用numpy或。要创建这本词典,我更喜欢一本。 注意,我在示例文件中使用了逗号作为分隔符

import numpy as np

data = np.genfromtxt('filename.csv', delimiter=',', skip_header=1, dtype=np.float32)
mydict = {row[0]: row[1:] for row in data}

print mydict
>> {1.0: array([  5.,   6.,  12.], dtype=float32),
>> 2.0: array([  6.,   9.,  13.], dtype=float32),
>> 3.0: array([  7.,  10.,  14.], dtype=float32),
>> 4.0: array([  8.,  11.,  15.], dtype=float32)}
d类型
当然可以根据您的要求进行修改。

您可以这样做:

i=iter(数字)
在zip(i,i,i,i)中为r打印[{r[0]:列表(r[1:])]

使用和
dict
生成器表达式,您可以轻松地执行此操作:

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]}
如果您有重复键,则需要另一种方法,否则将丢失数据,a将处理重复:

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对象上使用:

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)),[])]

因为你需要它在float中,如果你想知道如何在字典中实现它

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


不使用列标题?@ MattH,好像行和列标题都将被使用。您应该考虑接受所提供的答案之一。我是C语言的python新手,你能解释一下为什么for循环是这样工作的吗?谢谢@当然,我很乐意。但您是指f中的行的
?它间接地调用
f.readline()
作为迭代器对象,使您能够逐行处理文件。您也可以对f.readline()中的行执行
:)对于您的第一个方法,我更改了分隔符,因为它的制表符在我的文件中不是空格,可以正常工作。我确实有重复键,每四行键都会重复,但我希望它们在单独的字典中,因为它们可以作为计算类的单独实例进行操作。@cc6g11,那么我们只需要使用itertools.islice。我会的edit@cc6g11,您想要一个dicts列表是吗?@Padraic Cunningham那么引用任何键或其相应列表的任何部分的正确方式是什么?@cc6g11,
d[key]
将为您提供列表/值。如果要从列表中获取某个项目,请使用
d[key][index]
。你到底在用这些数据做什么?还要访问dict列表,可以迭代或索引列表以获取每个dict,然后按上述方式访问。如果在defaultdict代码中将extend更改为append,还可以为每个键存储列表列表
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