我已经浏览过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问题。
所以我的问题是我正在寻找创建字典的最佳方法。怎么做?
答案 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))