4

我想获取一个 python 列表字典,将列表转换为 numpy 数组,并使用列表理解将它们恢复到字典中。

例如,如果我有一本字典

myDict = {'A':[1,2,3,4], 'B':[5,6,7,8], 'C':'str', 'D':'str'}

我希望将键 A 和 B 下的列表转换为 numpy 数组,但保留字典的其他部分不变。导致

myDict = {'A':array[1,2,3,4], 'B':array[5,6,7,8], 'C':'str', 'D':'str'}

我可以用 for 循环做到这一点:

import numpy as np

for key in myDict:
    if key not in ('C', 'D'):
        myDict[key] = np.array(myDict[key])

但是可以通过列表理解来做到这一点吗?就像是

[myDict[key] = np.array(myDict[key]) for key in myDict if key not in ('C', 'D')]

或者,对于长列表的大型词典来说,实现这一目标的最快最有效的方法是什么。谢谢,实验室迷

4

3 回答 3

3

使用 Python 2.7 及更高版本,您可以使用字典理解

myDict = {'A':[1,2,3,4], 'B':[5,6,7,8], 'C':'str', 'D':'str'}
myDict = {key:np.array(val) if key not in {'C', 'D'} else val for key, val in myDict.iteritems()}

如果您低于 2.7 版(因此没有字典理解),您可以这样做:

myDict = {'A':[1,2,3,4], 'B':[5,6,7,8], 'C':'str', 'D':'str'}
dict((key, np.array(val) if key not in {'C', 'D'} else val for key, val in myDict.iteritems())
于 2013-08-28T06:42:21.863 回答
1

要更改除'C'and之外的所有项目'D'

>>> myDict = {'A':[1,2,3,4], 'B':[5,6,7,8], 'C':'str', 'D':'str'}
>>> ignore = {'C', 'D'}
>>> new_dict = {k : v if k in ignore else np.array(v) for k,v in myDict.iteritems()}

上面的dict-comprehension返回一个新的字典,要修改原来的dict,试试:

#myDict.viewkeys() - ignore --> set(['A', 'B'])
for key in myDict.viewkeys() - ignore:
    myDict[key] = np.array(myDict[key])

或者如果您只想更改'A'并且'B'

for key in {'A', 'B'}:
    myDict[key] = np.array(myDict[key])
于 2013-08-28T06:43:42.740 回答
0

获取一个 python 列表字典,将列表转换为 numpy 数组,并使用列表理解将它们恢复到字典中。

我会做:

myDict = {'A':[1,2,3,4], 'B':[5,6,7,8], 'C':'str', 'D':'str'}

def modifier(item):
    if type(item) == list:
        return np.array(item)
    else:
        return item

mod_myDict = {key: modifier(myDict[key]) for key in myDict.keys()}

然后该函数设置您在这种情况下将所有列表更改为数组所需的限制。这将返回:

{'A': array([1, 2, 3, 4]), 'B': array([5, 6, 7, 8]), 'C': 'str', 'D': 'str'}

注意:我相信这应该通过在if语句中使用条件来缩短,但我似乎无法理解,比如

mod_myDict = {key: np.array(myDict[key]) if type(myDict[key])==list else key: myDict[key] for key in myDict.keys()}

但是,这会引发错误。也许比我知道为什么更聪明的人!

于 2013-08-28T07:33:39.343 回答