Python 将此文件转换为字典

Python 将此文件转换为字典,python,python-2.7,numpy,dictionary,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

我已经环顾了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。这是一个Python2.7.x问题

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

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))
或者如果你喜欢一行

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))
我认为,+在这里可能有用:

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))
我认为,+在这里可能有用:

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


@不,我喜欢你的主意。你能再详细一点吗?第一个'num'值是键名。你的答案不会创造一个dict的dict吗?@CorruptedStack,dict理解的想法是在上面的答案中实现的,我认为这个答案适用于你的代码。。。没有?@no_name我想你是在编辑答案,因为我正在阅读。哈哈哈,你的一行比你使用itertools的结果做得更好。但我想在你完成之前我一定已经测试过你的答案了it@no_name我喜欢你的主意。你能再详细一点吗?第一个'num'值是键名。你的答案不会创造一个dict的dict吗?@CorruptedStack,dict理解的想法是在上面的答案中实现的,我认为这个答案适用于你的代码。。。没有?@no_name我想你是在编辑答案,因为我正在阅读。哈哈哈,你的一行比你使用itertools的结果做得更好。但我想在你完成之前我一定已经测试过你的答案了。你的意思是缩进最后一个if语句吗。是或否?@CorruptedStack缩进正如我的意思,在-循环的
完成后,我们可能需要完成最后一个键的列表。我试图测试您的代码。我在“keys=cycle(next(f).strip()表示范围(num)中的f)时遇到问题”。那行有打字错误吗?我得到错误“TypeError:int对象不是迭代器”@CorruptedStack我修复了那行,抱歉。循环也应该在
[]
中,以消除惰性。@CorruptedStack也就是说,上面的一行是更好的解决方案:)您的意思是缩进最后一个if语句吗。是或否?@CorruptedStack缩进正如我的意思,在
-循环的
完成后,我们可能需要完成最后一个键的列表。我试图测试您的代码。我在“keys=cycle(next(f).strip()表示范围(num)中的f)时遇到问题”。那行有打字错误吗?我得到错误“TypeError:int对象不是迭代器”@CorruptedStack我修复了那行,抱歉。循环也应该在
[]
中,以消除惰性。@CorruptedStack也就是说,上面的一行是更好的解决方案:)