从文本文件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