2012-10-14 26 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