使用列表推导式给Python字典赋值

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

或者说,对于一个包含大量长列表的字典,最快、最有效的实现方式是什么。

谢谢,labjunky


Haidro和Ashwini Chaudhary的回答非常相似,同时出现。 - labjunky
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()}

如果您的 Python 版本低于 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())

不错,但我在<dictcomp>((key, val))中得到了<ipython-input-135-01de37e639d5> ----> 1 myDict = {key:np.array(val) if val not in {'C', 'D'} else val for key, val in myDict.iteritems()} 类型错误:不可哈希类型:'list' - labjunky
尝试使用 ęlse key:val。Python 似乎认为在 else val 中,你想要使用 val 作为键(这就是为什么它会说 unhashable type)。 - Andras Nemeth
@Cucu 不,这只是我检查列表是否在集合中时犯的一个简单的打字错误,我应该检查值(不能是不可哈希的)是否在集合中。 - TerryA

1

更改除'C''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()}

上面的字典推导式返回一个新的字典,如果要修改原始字典,请尝试:
#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])

忽略拼写错误的第二行 - labjunky

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

然而,这会引发一个错误。也许比我更聪明的人知道为什么!


你可能想要类似条件推导式的东西,在这里:https://dev59.com/Rm855IYBdhLWcg3wlFaP - Brighid McDonnell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接