1

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

谢谢你。

4

2 回答 2

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'])
于 2012-10-14T20:22:22.200 回答
2

@TimPietzcker 给出了一个很好的解决方案。我应该提一下,而不是将数据存储在变量名中,比如list_alist_b——如果你有九个想要拔出的键,你会怎么做?- 我认为使用另一个字典(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])
于 2012-10-14T20:45:42.663 回答