2012-10-14 30 views
1

我是Python新手。一直在研究它與udacity課程,現在我正在嘗試做的事情,進一步學習。Python:我應該如何重新格式化這個短代碼塊?

我創建了這個簡短的代碼塊:

list_a = [] 
list_b = [] 
for e in a_list: 
    list_a.append(e['a']) 
    list_b.append(e['b']) 
list_b = set(list_b) 

(list_a以及不應該包含重複,但它不會在首位嘗試這樣不需要嚴格使其成爲一組,以及除非它使代碼更好看,更容易通過)

看過我的這段代碼後,它看起來不夠優雅或Pythonic足夠。

我的問題是,我應該如何重新格式化?我想了解做事的好方法。

我的目標是查看名爲a_list的列表,其中包含 字典作爲其項目。然後對於字典中的每個項目,將密鑰'a'的值 添加到名爲list_a的新列表中,並對 密鑰'b'執行相同的操作。然而,鍵'b'的列表應該是一組,並且嚴格不包含任何重複的 。

謝謝。

+1

'E [ '一']'似乎很奇怪 - 這使得它看起來像'a_dictionary'中的鍵是它們自己的字典,它們不可以。 [我猜可能是其他支持這種訪問的東西。] – DSM

+1

是的,你需要給出一個'a_dictionary'看起來像樣的例子。 –

+0

我很抱歉,那些是我的錯誤。編輯代碼塊刪除英文單詞以避免混淆任何人,我錯誤地做了一個cmd + v,它們超過了他們。只有list_a和list_b – Phil

回答

3

雖然這並遍歷a_list兩次,你可以把它改寫這樣的:

list_a = [e['a'] for e in a_list] 
set_b = {e['b'] for e in a_list} 

假設的Python 2.7或更高版本。

我選擇了名稱set_b而不是list_b,因爲我們正在做一套理解,而不是第二行中的列表理解。

如果你想遍歷a_list只有一次,那麼你至少可以跳過一個列表的創建:

list_a = [] 
set_b = set() 
for e in a_list: 
    list_a.append(e['a']) 
    set_b.add(e['b']) 
+0

謝謝蒂姆。爲了您的回答和耐心。 ;-) – Phil

2

@TimPietzcker給了細解。我應該提到,不是像變量名稱list_alist_b那樣存儲數據 - 如果你有9個鍵你想要拔出,你會怎麼做? - 我認爲這是更Python使用另一個詞典(Python的2.7+):

>>> list_of_dicts = [{'a': 1, 'b': 10}, {'a': 2, 'b': 20, 'c': 30}] 
>>> keep = ('a', 'b') 
>>> by_key = {k: {d[k] for d in list_of_dicts} for k in keep} 
>>> by_key 
{'a': set([1, 2]), 'b': set([10, 20])} 

,然後代替list_a,你會使用

>>> by_key['a'] 
set([1, 2]) 
+0

這是一件很棒的事情。感謝您的分享。我會牢記並使用它。高超! – Phil