python - 根据值在 Python 字典中选择对象

标签 python indexing dictionary

我是 Python 的新手,决定从 Matlab 跳槽。几天来我一直试图找到我的问题的答案,但没有成功!

问题:我有一堆具有特定属性的对象。请注意,我不是在谈论编程意义上的对象和属性——我是在谈论字面上的天文对象,我有不同类型的数值数据和物理属性。

在脚本的循环中,我遍历目录中的每个源/对象,进行一些计算,然后将结果保存在一个巨大的字典中。脚本的形式是这样的:

for i in range ( len(ObjectCatalogue) )

    calculate quantity1 for source i    

    calculate quantity2 for source i 

    determine attribute1 for source i 

    sourceDataDict[i].update( {'spectrum':quantity1} )

    sourceDataDict[i].update( {'peakflux':quantity2} )

    sourceDataDict[i].update( {'morphology':attribute1} )

因此,一旦我浏览了大约一百个来源,我就可以访问对象编号的光谱。 20 与 spectrumSource20 = sourceData[20]['spectrum'] 等

我想要做的是能够根据关键字“morphology”say 的值选择字典中的所有对象。所以说“形态学”的关键字可以采用“简单”或“复杂”的值。无论如何我可以在不诉诸循环的情况下做到这一点吗? IE。 - 我可以做一些事情,比如创建一个新字典,其中包含所有采用“形态学”关键字的“复杂”值的来源吗?

很难解释,但是使用我在 Matlab 中习惯的逻辑索引,它看起来像

complexSourceDataDict = sourceDataDict[*]['morphology'=='complex']

(其中*表示字典中的所有对象)

无论如何 - 任何帮助将不胜感激!

最佳答案

没有循环,没有。用list comprehension ,是的:

complex = [src for src in sourceDataDict.itervalues() if src.get('morphology') == 'complex']

如果 sourceDataDict 恰好是一个列表,你可以删除 itervalues:

complex = [src for src in sourceDataDict if src.get('morphology') == 'complex']

如果您考虑一下,评估一个 * 无论如何都意味着一个循环操作(假设它是有效的语法)。所以你的诀窍是对你正在使用的数据结构进行最有效的循环。

提高效率的唯一方法是提前索引所有数据对象“形态”键并使它们保持最新。

关于python - 根据值在 Python 字典中选择对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13448839/

相关文章:

postgresql - Postgres 仅索引扫描 : can we ignore the visibility map or avoid heap fetches?

c# - 从类型和实例的字典中获取实例

java - 基于引用相等性而不是 "value"相等性将 java.util.Date 作为键存储在 Map 中

python - 对于看似相同的列表,格式有不同的行为

python - 写类错误

python - 寻找一个工作的 linux 命令行工具从 rapidshare 下载

具有命名/标记类型的 C# 字典

python - 有没有比将 str 映射到 float 然后映射到 int 更好的方法?

postgresql - 在表上创建索引时,错误关系已存在于 PostgreSQL 中

当 SQL 包含带有 LIKE 的参数时,不使用 Oracle 语言索引