分配列表理解,差异
assigning list comprehensions, differences
好的,伙计们,我不经常使用 python(目前),我有点亲自动手了。
任何人都可以解释发生了什么,以便我阅读吗?
另外,如果您认为我的代码可以简化,请对此发表评论。
我正在尝试对两个列表中的每个元素进行所有组合,然后向每个组合添加 2 个设置变量。
>>> import itertools
>>> a = ['topic1', 'topic2']
>>> b = [{'key':'value'},{'key2':'value2'}]
>>> c = list(itertools.product(a,b))
>>> c
[('topic', {'key': 'value'}), ('topic', {'key2': 'value2'}), ('topic2', {'key': 'value'}), ('topic2', {'key2': 'value2'})]
但是,我需要制作列表以便能够在接下来的步骤中扩展它们,所以:
>>> c = [list(tup) for tup in (itertools.product(a,b))]
>>> c
[['topic', {'key': 'value'}], ['topic', {'key2': 'value2'}], ['topic2', {'key': 'value'}], ['topic2', {'key2': 'value2'}]]
>>> d = [2, "/some/folder"]
>>> e = [x.extend(d) for x in c]
>>> e
[None, None, None, None]
这里到底发生了什么?为什么 e 返回 None?我可以通过仅评估列表理解而不分配它来使其工作。为什么我可以在 c = (tup for tup ...) 而不是在 e 中分配我的列表理解?
>>> [tuple(x) for x in c]
[('topic', {'key': 'value'}, 2, '/some/folder/'), ('topic', {'key2': 'value2'}, 2, '/some/folder/'), ('topic2', {'key': 'value'}, 2, '/some/folder/'), ('topic2', {'key2': 'value2'}, 2, '/some/folder/')]
>>> c
[['topic', {'key': 'value'}, 2, '/some/folder/'], ['topic', {'key2': 'value2'}, 2, '/some/folder/'], ['topic2', {'key': 'value'}, 2, '/some/folder/'], ['topic2', {'key2': 'value2'}, 2, '/some/folder/']]
list.extend
方法变异一个列表in-place,变异操作的return值为None
。换句话说,extend
仅适用于 side-effects。
如果您想从之前的结果构建新结果而不是改变之前的结果,您可以改用列表串联。
e = [x + d for x in c]
好的,伙计们,我不经常使用 python(目前),我有点亲自动手了。
任何人都可以解释发生了什么,以便我阅读吗? 另外,如果您认为我的代码可以简化,请对此发表评论。
我正在尝试对两个列表中的每个元素进行所有组合,然后向每个组合添加 2 个设置变量。
>>> import itertools
>>> a = ['topic1', 'topic2']
>>> b = [{'key':'value'},{'key2':'value2'}]
>>> c = list(itertools.product(a,b))
>>> c
[('topic', {'key': 'value'}), ('topic', {'key2': 'value2'}), ('topic2', {'key': 'value'}), ('topic2', {'key2': 'value2'})]
但是,我需要制作列表以便能够在接下来的步骤中扩展它们,所以:
>>> c = [list(tup) for tup in (itertools.product(a,b))]
>>> c
[['topic', {'key': 'value'}], ['topic', {'key2': 'value2'}], ['topic2', {'key': 'value'}], ['topic2', {'key2': 'value2'}]]
>>> d = [2, "/some/folder"]
>>> e = [x.extend(d) for x in c]
>>> e
[None, None, None, None]
这里到底发生了什么?为什么 e 返回 None?我可以通过仅评估列表理解而不分配它来使其工作。为什么我可以在 c = (tup for tup ...) 而不是在 e 中分配我的列表理解?
>>> [tuple(x) for x in c]
[('topic', {'key': 'value'}, 2, '/some/folder/'), ('topic', {'key2': 'value2'}, 2, '/some/folder/'), ('topic2', {'key': 'value'}, 2, '/some/folder/'), ('topic2', {'key2': 'value2'}, 2, '/some/folder/')]
>>> c
[['topic', {'key': 'value'}, 2, '/some/folder/'], ['topic', {'key2': 'value2'}, 2, '/some/folder/'], ['topic2', {'key': 'value'}, 2, '/some/folder/'], ['topic2', {'key2': 'value2'}, 2, '/some/folder/']]
list.extend
方法变异一个列表in-place,变异操作的return值为None
。换句话说,extend
仅适用于 side-effects。
如果您想从之前的结果构建新结果而不是改变之前的结果,您可以改用列表串联。
e = [x + d for x in c]