将此文件转换为字典

时间:2015-02-07 14:48:13

标签: python python-2.7 numpy dictionary

我已经浏览过Stackoverflow,但可能会在这里找不到它。我有一个列表,我想转换成字典。

3
banana
apple
orange
5.00E-2
1
7.02E-4
1.00E-4
4
5.13E-4
-5.76E-2
8
7.23E-8
-6.12E-9
4
5.02E

数字3是键的数量。接下来的3个字符串是键名。接下来的3个值是列表的第一个元素....依此类推。例如,我会得到:

  mydict['banana']=[ 5.00E-2, 1.00E-4, -5.76E-2, -6.12E-9]
  mydict['apple'] =[1,           4,       8,        4]
  mydict['orange']=[ 7.02E-4, 5.13E-4,  7.23E-8,   np.nan ]

请注意,最后一个元素不完整,只是“5.02E”,必须用numpy.nan替换。此外,每个列表中的元素数必须相同,缺少的值应为numpy.nan。这是一个python 2.7.x问题。

所以我的问题是我正在寻找创建字典的最佳方法。怎么做?

2 个答案:

答案 0 :(得分:4)

num = mylist[0]
mydict = {}
for i in range(num):
    mydict[mylist[i + 1]] = mylist[i + 1 + num::num]

或者如果你喜欢单行,

mydict = {mylist[i + 1]:mylist[num + i + 1::num] for i in range(mylist[0])}

请注意,这不会替换numpy.nan的遗失物品;这就像是

from itertools import izip_longest
import numpy as np

num      = mylist[0]
labels   = mylist[1:num + 1]
num_cols = (len(mylist) - 2) // num
cols     = (mylist[1 + c*num::num] for c in range(1, num_cols + 2))
rows     = izip_longest(*cols, fillvalue=np.nan)

mydict = dict(zip(labels, rows))

答案 1 :(得分:0)

我认为,itertools.cycle + izip在这里可能很有用:

from collections import defaultdict
from itertools import cycle, izip, count, repeat

result = defaultdict(list)

with open(path) as fp:
    num = int(next(fp))
    idx = 0

    # create infinite loop of repeating keys to match them with the values:
    keys = cycle([next(fp).strip() for _ in range(num)])

    for k, v, c in izip(keys, fp, count()):
        result[k].append(np.float(v))

    if (c + 1) % num: # need to populate with nans
        result[k].extend(repeat(np.nan, num - (c + 1) % num))