从依赖于多个键的dict列表中获取元素索引的Pythonic方法

2024-09-24 00:34:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我对python非常陌生,我有以下问题。我想出了以下解决办法。我想知道它是不是“Python”。如果不是,最好的解决方案是什么?你知道吗

问题是:

  • 我有一份口述清单
  • 每个dict至少有三个项目
  • 我想在dict列表中找到有三个特定值的位置

这是我的python示例

import collections
import random

# lets build the list, for the example 
dicts = [] 
dicts.append({'idName':'NA','idGroup':'GA','idFamily':'FA'})
dicts.append({'idName':'NA','idGroup':'GA','idFamily':'FB'})
dicts.append({'idName':'NA','idGroup':'GB','idFamily':'FA'})
dicts.append({'idName':'NA','idGroup':'GB','idFamily':'FB'})
dicts.append({'idName':'NB','idGroup':'GA','idFamily':'FA'})
dicts.append({'idName':'NB','idGroup':'GA','idFamily':'FB'})
dicts.append({'idName':'NB','idGroup':'GB','idFamily':'FA'})
dicts.append({'idName':'NB','idGroup':'GB','idFamily':'FB'})


# let's shuffle it, again for example
random.shuffle(dicts)

# now I want to have for each combination the index 

# I use a recursive defaultdict definition 
# because it permits creating a dict of dict 
# even if it is not initialized 

def tree(): return collections.defaultdict(tree)

# initiate mapping 
mapping = tree()

# fill the mapping
for i,d  in enumerate(dicts):        

    idFamily = d['idFamily']
    idGroup = d['idGroup']
    idName = d['idName']

    mapping[idName][idGroup][idFamily] = i

# I end up with the mapping providing me with the index within 
# list of dicts

Tags: theforfbmappingdictfagana
1条回答
网友
1楼 · 发布于 2024-09-24 00:34:00

在我看来是合理的,但也许有点过分了。你可以这样做:

mapping = {
    (d['idName'], d['idGroup'], d['idFamily']) : i
    for i, d in enumerate(dicts)
}

然后用mapping['NA', 'GA', 'FA']而不是mapping['NA']['GA']['FA']访问它。但这实际上取决于您计划如何使用mapping。如果你需要能够将mapping['NA']作为字典使用,那么你所拥有的就足够了。你知道吗

相关问题 更多 >