我是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'的列表应该是一个集合,严格来说不是 包含任何重复项。
谢谢。
答案 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_a
和list_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])