簡體   English   中英

Python-嵌套的理解列表

[英]Python - nested comprehension list

我有以下結構:

input = {
'clark': {
          'elements':['id[3]_element[1]','id[3]_element[2]','id[3]_element[3]'],
          'nickname': 'superman',
          'registered': 'Y'
         },
'rodger': {
          'elements':['id[2]_element[1]','id[2]_element[2]','id[2]_element[3]'],
          'nickname': 'rodjeuur',
          'registered': 'N'
         },
'ratman': {
          'elements':['id[6]_element[1]','id[6]_element[2]','id[6]_element[3]'],
          'nickname': 'rat',
          'registered': 'Y'
         },
'marylin': {
          'elements':['id[90]_element[1]','id[90]_element[2]','id[90]_element[3]'],
          'nickname': 'monroe',
          'registered': 'Y'
         },
'snoopy': {
          'elements':['id[1]_element[1]','id[1]_element[2]','id[1]_element[3]'],
          'nickname': 'lame',
          'registered': 'N'
         },
'dummy_field[1]': 'dogfood',
'dummy_field[2]': 'monkeyjump',
'id[3]_element[1]':{
    'feature': 'vision glass',
    'value': 0.12,
    'color': 'blue'
},
'id[3]_element[2]':{
    'feature': 'height',
    'value': 1.88
},
'id[3]_element[3]':{
    'feature': 'cookingskill',
    'value': 0
},
'id[6]_element[1]':{
    'feature': 'rat teeth',
    'value': 25,
    'similarity':'luis suarez'
},
'id[6]_element[2]':{
    'feature': 'height',
    'value': 1.70
},
'id[6]_element[3]':{
    'feature': 'cookingskill',
    'value': 0.5
},
'id[2]_element[1]':{
    'feature': 'tennis raquet',
    'value': 500000,
    'particularity':'second arm'
},
'id[2]_element[2]':{
    'feature': 'height',
    'value': 1.78
},
'id[2]_element[3]':{
    'feature': 'trickshot',
    'value': 120
},
'id[1]_element[1]':{
    'feature': 'mood',
    'value': 0,
    'particularity':'depressed'
},
'id[1]_element[2]':{
    'feature': 'height',
    'value': 0.45
},
'id[1]_element[3]':{
    'feature': 'sadness',
    'value': 10000000
},
'id[90]_element[1]':{
    'feature': 'charm',
    'value': 500000
},
'id[90]_element[2]':{
    'feature': 'height',
    'value': 1.72
},
'id[90]_element[3]':{
    'feature': 'cookingskills',
    'value': 0
}
}

以及要迭代的列表:

lnames=['clark','ratman','snoopy','marylin']

我想獲得以下詞典列表作為結果:

output=[{'vision glass':0.12, 'height':1.88, 'cookingskill':0},
    {'rat teeth':25, 'height':1.70, 'cookingskill':0.5},
    {'mood':0, 'height':0.45, 'sadness':10000000},
    {'charm':500000, 'height':1.72, 'cookingskills':0}
]

我開始了非常基本的代碼:

output=[{.... for el in input[name]['elements']} for name in lnames]

我可以訪問每個名稱元素,然后遍歷它們以訪問不同的“功能”和“值”,但是我不知道如何將它們組合成給定名稱的字典。

有人有主意嗎?

編輯

現在假設我有相同的輸入,除了每個名稱的“元素”字段中有一個“ @”:

input = {
'clark': {
          'elements':['@id[3]_element[1]','@id[3]_element[2]','@id[3]_element[3]'],
          'nickname': 'superman',
          'registered': 'Y'
         },
'rodger': {
          'elements':['@id[2]_element[1]','@id[2]_element[2]','@id[2]_element[3]'],
          'nickname': 'rodjeuur',
          'registered': 'N'
         },
'ratman': {
          'elements':['@id[6]_element[1]','@id[6]_element[2]','@id[6]_element[3]'],
          'nickname': 'rat',
          'registered': 'Y'
         },
'marylin': {
          'elements':['@id[90]_element[1]','@id[90]_element[2]','@id[90]_element[3]'],
          'nickname': 'monroe',
          'registered': 'Y'
         },
'snoopy': {
          'elements':['@id[1]_element[1]','@id[1]_element[2]','@id[1]_element[3]'],
          'nickname': 'lame',
          'registered': 'N'
         },
'dummy_field[1]': 'dogfood',
'dummy_field[2]': 'monkeyjump',
'id[3]_element[1]':{
    'feature': 'vision glass',
    'value': 0.12,
    'color': 'blue'
},
'id[3]_element[2]':{
    'feature': 'height',
    'value': 1.88
},
'id[3]_element[3]':{
    'feature': 'cookingskill',
    'value': 0
},
'id[6]_element[1]':{
    'feature': 'rat teeth',
    'value': 25,
    'similarity':'luis suarez'
},
'id[6]_element[2]':{
    'feature': 'height',
    'value': 1.70
},
'id[6]_element[3]':{
    'feature': 'cookingskill',
    'value': 0.5
},
'id[2]_element[1]':{
    'feature': 'tennis raquet',
    'value': 500000,
    'particularity':'second arm'
},
'id[2]_element[2]':{
    'feature': 'height',
    'value': 1.78
},
'id[2]_element[3]':{
    'feature': 'trickshot',
    'value': 120
},
'id[1]_element[1]':{
    'feature': 'mood',
    'value': 0,
    'particularity':'depressed'
},
'id[1]_element[2]':{
    'feature': 'height',
    'value': 0.45
},
'id[1]_element[3]':{
    'feature': 'sadness',
    'value': 10000000
},
'id[90]_element[1]':{
    'feature': 'charm',
    'value': 500000
},
'id[90]_element[2]':{
    'feature': 'height',
    'value': 1.72
},
'id[90]_element[3]':{
    'feature': 'cookingskills',
    'value': 0
}
}

使用以下代碼:

import re

def at(x):
    return input[re.sub(r'@','',x)] 

我相信我可以繼續這樣的字典理解:

output=[{at(el)['feature']:at(el)['value'] for el in input[name]['elements']} for name in lnames]

但我收到錯誤NameError: global name 'at' is not defined 當我使用列表推導而不是字典推導時,它可以工作,但是:

1-我仍然不知道這個名稱錯誤是什么意思,因為它與字典理解有關。 2-這不是預期的結果。

與最初的答案相比,編輯並不那么復雜,但是要點1 /確實讓我很煩!

你快到了 它應該是:

output=[{input[el]['feature']:input[el]['value']
  for el in input[name]['elements']} for name in lnames]

存在檢查的綜合解決方案

output = [
    {
        input[element]['feature'] : input[element]['value']
        for element in input.get(name,{}).get('elements',[])
    }
    for name in lnames
]

有時有助於寫出規則的循環,然后轉換為列表理解。 這樣做之后,我得到了以下代碼:

output = [{input[element]['feature']: input[element]['value'] 
           for element in input[name]['elements']}
          for name in lnames]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM