我有一堆包含气象数据的文本文件。每个文本文件存储半小时的数据,即18000个观察值(行)。共有48个文件(一整天),我已将所有数据存储在以下结构中:
# all_data is a list of dictionaries, len=48 --> each dict represents one file
all_data = [{'time': 0026,
'filename': 'file1.txt',
# all_data['data'] is a list of dictionaries, len=18000
# each dict in all_data['data'] represents one line of corresponding file
'data': [{'x': 1.345, 'y': -0.779, 'z': 0.023, 'temp': 298.11},
{'x': 1.277, 'y': -0.731, 'z': 0.086, 'temp': 297.88},
...,
{'x': 2.119, 'y': 1.332, 'z': -0.009, 'temp': 299.14}]
},
{'time': 0056,
'filename': 'file2.txt',
'data': [{'x': 1.216, 'y': -0648, 'z': 0.881, 'temp': 301.11},
{'x': 0.866, 'y': 0.001, 'z': 0.031, 'temp': 301.32},
...,
{'x': 0.181, 'y': 0.498, 'z': 0.101, 'temp': 300.91}]
},
...
]
现在我需要解压缩它。我需要按顺序创建一个x(all_data[i]['data'][j]['x']
)的所有值的列表,以用于绘图。幸运的是,数据已按顺序存储。
我知道我可以简单地做这样的事情来实现我的目标:
x_list = []
for dictionary in all_data:
for record in dictionary['data']: # loop over list of dictionaries
x_list.append(record['x'])
但是我必须为许多变量做类似的事情,为了简单起见我没有在这里列出,我真的不想重写这个循环20次,也不想手工创建20个新变量列表。
有没有办法使用列表推导来迭代这样的嵌套数据结构?
我吐了一个祷告并尝试过:
[x for x in all_data[i for i in len(all_data)]['data'][j for j in len(all_data[i]['data'])]
当然没有用。有什么想法吗?
这是所需的输出,这只是' x'的值。在嵌套列表'数据':
all_x = [1.345, 1.277, ..., 2.119, 1.216, 0.866, ..., 0.181, ...]
提前致谢!
答案 0 :(得分:1)
你可以试试这个:
import itertools
all_data = [{'time': 0026, 'filename': 'file1.txt', 'data': [{'x': 1.345, 'y': -0.779, 'z': 0.023, 'temp': 298.11}, {'x': 1.277, 'y': -0.731, 'z': 0.086, 'temp': 297.88}, {'x': 2.119, 'y': 1.332, 'z': -0.009, 'temp': 299.14}]},
{'time': 0056, 'filename': 'file2.txt','data': [{'x': 1.216, 'y': -648, 'z': 0.881, 'temp': 301.11}, {'x': 0.866, 'y': 0.001, 'z': 0.031, 'temp': 301.32},{'x': 0.181, 'y': 0.498, 'z': 0.101, 'temp': 300.91}]}]
x_data = list(itertools.chain.from_iterable([[b["x"] for b in i["data"]] for i in all_data]))
print(x_data)
输出:
[1.345, 1.277, 2.119, 1.216, 0.866, 0.181]
答案 1 :(得分:1)
from itertools import chain
[ k['x'] for k in chain.from_iterable([ i['data'] for i in all_data ]) ]
答案 2 :(得分:1)
如果您不介意使用熊猫,这可能是实现您想要的一切的好方法。运行
dataDfList = [pandas.DataFrame(f['data']) for f in all_data]
将生成一个DataFrame列表,每个看起来像:
| | temp | x | y | z |
|------|--------|-------|--------|--------|
| 0 | 298.11 | 1.345 | -0.779 | 0.023 |
| 1 | 297.88 | 1.277 | -0.731 | 0.086 |
| 2 | 299.14 | 2.119 | 1.332 | -0.009 |
然后可以容易地绘制这些中的每一个。您也可以使用MultiIndex完成此操作,例如:通过使用pandas.concat(dataDfList)
答案 3 :(得分:0)
如果我理解正确,您希望输出为:
不仅列出x
的值。
然后这是你的代码:
values = [row.values() for day in all_data for row in day['data']]
values
中的每个项目都是x - >中变量值的列表。 z / temp,或矢量值矩阵。
对于您的上述示例数据,输出为:
[[-0.779, 1.345, 0.023, 298.11], [-0.731, 1.277, 0.086, 297.88], [1.332, 2.119, -0.009, 299.14], [-0.648, 1.216, 0.881, 301.11], [0.001, 0.866, 0.031, 301.32], [0.498, 0.181, 0.101, 300.91]]
对应['x', 'y', 'z', 'temp']
变量。
编辑:如果要提取一个变量的值,请使用numpy
,将输出转换为数组并提取相应的列。