2016-01-18 42 views
1

我不能讓我的頭在這一個。還是我過於複雜的事情?我試圖讓這個代碼更加'Pythonic'。這裏Python的理解,名單字典

statuses = {record['id'] : [] for record in data} 

for record in data: 
    for status in record['statuses']: 
     data = { 
      'status_code': status['statusCode'], 
      'short_desc': status['statusShortDesc'], 
     } 

     if 'statusLongDesc' in status: 
      data.update({'long_desc': status['statusLongDesc']}) 
     else: 
      data.update({'long_desc': ''}) 

     statuses[record['id']] += [data] 
    } 
} 

一些挑戰,下面我知道代碼是錯誤的,但我想傳達給得到我想要用了知道如何:

  • 如何在字典中的更新列表理解?沿着這條線。這會工作嗎?有些事情對我來說並不合適。我是否被花括號帶走了?

    statuses = { 
        { 
         record['id']: list({ 
          'status_code': status['statusCode'], 
          'short_desc': status['statusShortDesc'], 
          'long_desc': '' 
         }) 
        } 
        for record in data for status in record['statuses'] 
    } 
    

這將產生TypeError: unhashable type: 'dict'

  • 我怎樣才能再沒有在我原來的代碼重複數據部分像調整long_desc? (我的字典實際上要長很多,看起來很瘋狂,重複所有的一行。)像:then if 'statusLongDesc' in status list.extend('long_desc': status['statusLongDesc'])增加了上述理解。
+0

你的原始代碼是更「pythonic」國際海事組織。它很容易閱讀,而且意圖很清楚。 pythonic意味着簡短,簡潔並且易於閱讀。 –

回答

2

我不會過分複雜的東西。您可以用來簡化您的原件的最大的事情是使用get方法。

statuses = {record['id']: [] for record in data} 

for record in data: 
    for status in record['statuses']:   
     statuses[record['id']].append({ 
      'status_code': status['statusCode'], 
      'short_desc': status['statusShortDesc'], 
      'long_desc': status.get('statusLongDesc', ''), 
     }) 

現在,如果你願意,你可以用一個使用列表理解的詞典理解替換循環。

statuses = { record['id']: [{...} for status in record['statuses']] for record in data } 

其中{...}是在原來的data字典。

+0

我覺得很奇怪,他重新編輯數據時如何重新綁定數據。 – GingerPlusPlus

+0

好點。我會在答案中完全刪除臨時名稱,因爲它不是必需的。 – chepner

+0

謝謝。得到方法是我不會忘記的新方法。便利。 – s27840

1

可以使用的理解很容易地創建列表,而不是.append ING:

statuses = {} 

for record in data: 
    statuses[record['id']] = [ 
     { 
      'status_code': status['statusCode'], 
      'short_desc': status['statusShortDesc'], 
      'long_desc': status.get('statusLongDesc', ''), 
     } for status in record['statuses'] 
    ] 

也可以通過這種方式一個表達式做,如果我得到嵌套的內涵右:

statuses = { 
    record['id']: [{ 
      'status_code': status['statusCode'], 
      'short_desc': status['statusShortDesc'], 
      'long_desc': status.get('statusLongDesc', ''), 
     } for status in record['statuses'] 
    ] for record in data 
} 

但我覺得它是不可讀的。