如何在python字典中使用1个命令访问2个键

时间:2018-02-04 03:48:41

标签: python numpy dictionary scipy

我正在尝试使用scipy的.matio.loadmat()文件加载一些数据。该函数基本上返回一个包含文件中所有数据的字典。如果我只想从数据文件中获取一个值,我可以执行val_a = io.loadmat(filename)['val_a']之类的操作。但现在我想取出2个值。我还能用一个命令实现这个目标吗?或者我是否必须首先将字典分配给变量,然后逐个获取这两个值?

raw_data = io.loadmat(filename)
val_a = raw_data['val_a']
val_b = raw_data['val_b']

但我要找的是像

val_a, val_b = io.loadmat(filename)['val_a', 'val_b']

通过这样做,我希望避免文件中不必要的数据占用我的记忆。

2 个答案:

答案 0 :(得分:8)

你说

  

通过这样做,我希望避免占用我记忆的文件中不必要的数据

如果您的目标是避免阅读您不感兴趣的文件部分,请告诉SciPy不要通过提供variable_names argument说明哪些部分来阅读这些部分:

raw_data = scipy.io.loadmat(filename, variable_names=['val_a', 'val_b'])
val_a = raw_data['val_a']
val_b = raw_data['val_b']

在不使用variable_names的情况下,您可以做的最好的事情就是在提取出您感兴趣的部分后摆脱对dict的引用,并让Python回收内存:

raw_data = scipy.io.loadmat(filename)
val_a = raw_data['val_a']
val_b = raw_data['val_b']
del raw_data

没有语法可以一次从dict中提取两个值。

答案 1 :(得分:1)

在Python 3.x中,您可以在列表理解下方使用以下内容实现此目的:

my_keys = ['val_a', 'val_b']  # List of keys you want to fetch

val_a, val_b = [my_dict[key] for my_dict in [io.loadmat(filename)] for key in my_keys]
#        wrapped `dict` inside `list` in order to allow your     ^
#        dict available within the *list comorehension*

示例示例:

>>> my_keys = ['a', 'b']

>>> [my_dict[key] for my_dict in [{'a': 1, 'b': 2, 'c': 3, 'd':4}] for key in my_keys]
[1, 2]   # returned values corresponding to 'a' , 'b'

# `my_dict` can't be referenced outside the scope
>>> my_dict
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'my_dict' is not defined

PS:上面的代码也会在Python 2.x上执行,但是列表解析中定义的变量会有内存泄漏。这意味着,在消耗内存的列表理解之外,将提供对my_dict的引用。