【问题标题】:Matrix file to dictionary in python矩阵文件到python中的字典
【发布时间】:2016-04-16 11:12:31
【问题描述】:

我有一个文件matrix.txt,其中包含:

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

我想读取文件的内容并将其存储在字典中,如下所示:

{('A', 'A') : 1, ('A', 'B') : 2, ('A', 'C') : 3,
 ('B', 'A') : 4, ('B', 'B') : 5, ('B', 'C') : 6,
 ('C', 'A') : 7, ('C', 'B') : 8, ('C', 'C') : 9}

【问题讨论】:

  • 请参考stackoverflow.com/help/mcve 您确实应该包含您尝试过的代码,以及为什么它导致的输出不是您所期望的。
  • 我投票结束这个问题,因为它要求 SE 社区提供代码,而没有引用任何问题或尝试。

标签: python file dictionary matrix


【解决方案1】:

pandas 让它非常整洁。

import pandas as pd

方法 1

df = pd.read_table('matrix.txt', sep='  ')
>>> df
   A  B  C
A  1  2  3
B  4  5  6
C  7  8  9

d = df.to_dict()
>>> d
{'A': {'A': 1, 'B': 4, 'C': 7},
 'B': {'A': 2, 'B': 5, 'C': 8},
 'C': {'A': 3, 'B': 6, 'C': 9}}

new_d = {}
{new_d.update(g) for g in [{(r,c):v for r,v in v1.iteritems()} for c,v1 in d.iteritems()]}

>>> new_d
{('A', 'A'): 1,
 ('A', 'B'): 2,
 ('A', 'C'): 3,
 ('B', 'A'): 4,
 ('B', 'B'): 5,
 ('B', 'C'): 6,
 ('C', 'A'): 7,
 ('C', 'B'): 8,
 ('C', 'C'): 9}

方法 2

df = pd.read_table('matrix.txt', sep='  ')
>>> df
   A  B  C
A  1  2  3
B  4  5  6
C  7  8  9

new_d = {}
for r, v in df.iterrows():
    for c, v1 in v.iteritems():
        new_d.update({(r,c): v1})

>>> new_d
{('A', 'A'): 1,
 ('A', 'B'): 2,
 ('A', 'C'): 3,
 ('B', 'A'): 4,
 ('B', 'B'): 5,
 ('B', 'C'): 6,
 ('C', 'A'): 7,
 ('C', 'B'): 8,
 ('C', 'C'): 9}

【讨论】:

    【解决方案2】:

    您可以使用itertools.product 创建您的密钥,使用文件头和转置后的第一列来创建密钥,然后只需将剩余的行压缩转换回其原始状态并创建一个可迭代的拆分子字符串.为了维持秩序,我们还需要使用OrderedDict

    from collections import OrderedDict
    from itertools import izip,  product, imap, chain
    
    with open("matrix.txt") as f:
        head, zipped = next(f).split(), izip(*imap(str.split, f))
        cols = next(zipped)
        od = OrderedDict(zip(product(head, cols), chain.from_iterable(izip(*zipped))))
    

    输出:

      OrderedDict([(('A', 'A'), '1'), (('A', 'B'), '2'), (('A', 'C'), '3'),
      (('B', 'A'), '4'), (('B', 'B'), '5'), (('B', 'C'), '6'), (('C', 'A'), '7'),
      (('C', 'B'), '8'), (('C', 'C'), '9')])
    

    对于 python3,只需使用 mapzip

    或者不转置和使用 csv 库:

    from collections import OrderedDict
    from itertools import izip,repeat
    import csv
    
    with open("matrix.txt") as f:
        r = csv.reader(f, delimiter=" ", skipinitialspace=1)
        head = repeat(next(r))
        od = OrderedDict((((row[0], k), v) for row in r 
                         for k, v in izip(next(head), row[1:])))
    

    输出将是相同的。

    【讨论】:

      【解决方案3】:

      以下 Python3 函数将生成所有矩阵项及其索引,与 dict 构造函数兼容:

      def read_mx_cells(file, parse_cell = lambda x:x):
        rows = (line.rstrip().split() for line in file)
        header = next(rows)
        for row in rows:
          row_id = row[0]
          for col_id,cell in zip(header, row[1:]):
            yield ((row_id, col_id), parse_cell(cell))
      
      with open('matrix.txt') as f:
        for x in read_mx_cells(f, int):
          print(x)
      # ('A','A'),1
      # ('A','B'),2
      # ('A','C'),3 ...
      
      with open('matrix.txt') as f:
        print(dict(read_mx_cells(f, int)))
      # { ('A','A'): 1, ('A','B'): 2, ('A','C'): 3 ... } 
      # Note that python dicts dont retain item order
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-20
        • 2015-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多