【问题标题】:Populating dictionary from text file PYTHON从文本文件 PYTHON 填充字典
【发布时间】:2015-09-27 11:47:20
【问题描述】:

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

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 个值设置为一个带有循环的键,但我怎样才能轻松地将其余值作为一个列表放入相应的键中。

【问题讨论】:

  • 不使用列标题?
  • @MattH 似乎行标题和列标题都将被使用。
  • 您应该考虑接受所提供的答案之一。

标签: python list loops dictionary


【解决方案1】:
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)

【讨论】:

  • 完美运行。我是来自 C 的 python 新手,你能解释一下为什么 for 循环会这样工作吗?谢谢!
  • @cc6g11 当然,我很乐意。但你的意思是for row in f?它间接调用f.readline() 作为迭代器对象,使您能够逐行处理文件。你也可以for row in f.readline() :)
【解决方案2】:

您可以使用带有生成器表达式的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:]))

如果您希望每四行在其自己的字典中,您可以在 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]}]

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

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

【讨论】:

  • 对于您的第一种方法,我更改了分隔符,因为它的制表符不是我文件中的空格,工作正常。我确实有重复键,每四行键将重复一次,但我希望它们在单独的字典中,因为它们可以作为计算类的单独实例进行操作。
  • @cc6g11,那么我们只需要使用itertools.islice。我会编辑
  • @cc6g11,你想要一个字典列表吗?
  • @Padraic Cunningham 那么引用任何键或其相应列表的任何部分的正确方法是什么?
  • @cc6g11, d[key] 将为您提供列表/值。如果您想从列表中获取某个项目,请使用d[key][index]。你实际上在用这些数据做什么?还要访问字典列表,要么迭代或索引列表以获取每个字典,然后按上述方式访问。如果您将扩展更改为附加到默认字典代码中,您还可以存储每个键的列表列表
【解决方案3】:

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

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)}

dtypes当然可以根据你的要求进行修改。

【讨论】:

    【解决方案4】:

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

    这个答案只是对 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
    

    【讨论】:

      【解决方案5】:

      你可以这样做:

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

      【讨论】:

        猜你喜欢
        • 2013-03-15
        • 1970-01-01
        • 2013-12-22
        • 1970-01-01
        • 2019-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多