【问题标题】:PYTHON: Read a file into a dictionary with column n as key and column m as valuePYTHON:将文件读入字典,其中 n 列作为键,m 列作为值
【发布时间】:2012-11-24 21:46:50
【问题描述】:

如果它只有两列,我知道该怎么做,但是如果文件是这样的呢:

01 asd 023 green
01 dff 343 blue
02 fdf 342 yellow
02 fff 232 brown
02 kjf 092 green
03 kja 878 blue

然后说,我希望第 2 列成为我的字典的键,并希望第 4 列成为该键的内容?我在想,解决这个问题的一种方法是完全删除其他无用的列,以便只保留我需要的两个,然后我可以使用我也在这个网站上看到的脚本来制作字典

Python - file to dictionary?

当然,这是解决问题的一种方法,非常感谢任何提示。

【问题讨论】:

  • 你怎么知道你的键在第 2 列,值在第 4 列?列是如何分隔的?总是像你的例子那样按空格?
  • 是的,很抱歉。它们由空格分隔,这是一个示例,假设在这个示例中,我的键总是在 2 上,值总是在 4 上
  • 好的,那么我会选择@NPE 的解决方案。

标签: python dictionary


【解决方案1】:
d = {}
with open('data.txt') as f:
  for line in f:
    tok = line.split()
    d[tok[1]] = tok[3]
print(d)

这会产生

{'kja': 'blue', 'kjf': 'green', 'fdf': 'yellow', 'asd': 'green', 'fff': 'brown', 'dff': 'blue'}

split()(不带参数)将行拆分为字符串列表。 tok[1]tok[3] 然后使用 list indexing 处理这些列表中的第二个和第四个值,将它们分配给 dictionary 的键和值 (d[key] = value)。

【讨论】:

  • 感谢您的帮助,您所做的是在(行)中读取文件并将列拆分。 d[tok[1]] = tok[3] 部分意味着您使用 tok[1] 作为第 1 列,而 tok[3] 作为第 4 列,对吗?非常感谢简单易懂的代码,我希望我的初学者词汇不会惹恼任何人。也感谢您的快速响应!
  • @Dergyll:不客气。是的,tok[1](第 2 列)是键,tok[3](第 4 列)是值。
  • @NPE 请注意,在 line.strip().split() 中,strip() 是多余的,因为 split() / split(None) 的行为是多余的
  • 您好 NPE,我收到一个奇怪的错误:“AttributeError: 'list' object has no attribute 'split'”这是什么意思?我的原始文件是奇怪的格式还是什么?它是一个 txt 文件...
  • @Dergyll:这个确切的代码对我有用。如果没有看到您正在运行的确切代码和异常堆栈跟踪,很难说出您的情况出了什么问题。
【解决方案2】:

类似

from operator import itemgetter
keyval = itemgetter(1, 3)
with open('file') as fin:
    keyvals = (keyval(line.split()) for line in fin)
    my_dict = dict(keyvals)

注意事项:

这与@NPE 的答案不同,因为它使用内置的dict 进行初始化,而不是在循环之外声明它。它还利用itemgetter 作为键检索函数,从每行获取第 2 和第 4 个值(当用空格分隔时),并使用生成器表达式将其应用于文件中的每一行。

如果my_dict = dict(keyvals) 失败还有一个小优势(尽管通常不是那么重要),那么名称永远不会被绑定,而如果通过按键分配发生某些事情,那么可能会声明 dict with 语句之外的语句以“脏”结尾。

【讨论】:

  • 不需要使用itemgetter
  • @JonMartin 并按照您的示例将line 拆分两次?
  • 我这样做只是为了快速的两行解决方案。拆分一次当然更好。
【解决方案3】:
d = {}
with open("file.txt") as f:
    for line in f:
        (key1, val1, key2, val2) = line.split()
        d[int(key1)] = val
        d[int(key2)] = val2

会给你所有的。否则,您可以在 NPE 上做一些类似的事情。

【讨论】:

    【解决方案4】:
    for line in f.readlines():
        my_dic[line.split(' ')[1]] = line.split(' ')[3]
    

    【讨论】:

    • for line in f.readlines() 只是for line in f ...(除非您打算将整个文件读入内存)
    猜你喜欢
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 2013-03-04
    • 1970-01-01
    相关资源
    最近更新 更多