Python:我应该如何重新格式化这个短代码块?

时间:2012-10-14 20:16:26

标签: python python-2.7

我是Python的新手。一直在学习关于udacity的课程,现在我正在努力学习更多东西。

我创建了这个短代码块:

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'的列表应该是一个集合,严格来说不是   包含任何重复项。

谢谢。

2 个答案:

答案 0 :(得分: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'])

答案 1 :(得分:2)

@TimPietzcker提供了一个很好的解决方案。我应该提一下,而不是将数据存储在list_alist_b这样的变量名中 - 如果你有9个键要拔出,你会怎么做? - 我认为使用另一个字典(Python 2.7 +)更加pythonic:

>>> 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])