假设这样一个dict有多个项目:
d = {'foo':['c', 'a', 't'], 'bar':['d', 'o', 'g']}
我想制作
l = ['c', 'a', 't', 'd', 'o', 'g']
In [75]: l = []
...: for i in d.values():
...: l.extend(i)
...: print(l)
['c', 'a', 't', 'd', 'o', 'g']
尝试使用extend
方法在一行内实现它。
In [76]: [ [].extend(i) for i in d.values() ]
Out[76]: [None, None]
In [79]: [ list().extend(i) for i in d.values()]
Out[79]: [None, None]
输出[None, None]
的列表理解背后的原理是什么?
很容易实现
In [78]: [i for j in d.values() for i in j]
Out[78]: ['c', 'a', 't', 'd', 'o', 'g']
是否可以用extend
单线完成?
答案 0 :(得分:1)
直接回答:您想要的结果无法与extend
正如评论extend
中已经提到的那样,修改了列表并返回None。
你没有得到结果,因为你写道:
列表理解中的[].extend(i)
对于每次迭代,您的代码将构造新的列表元素[]
并使用您传递的迭代值i
对其进行扩展,但它不会存储在任何位置,因此您的代码将执行操作但您赢了#因为你之前没有构建一个列表来避免它,你需要编写这样的代码:
l=[] # create a list first
[l.extend(i) for i in d.values()] # for each iteration list l will be extended
print(l) # ['c', 'a', 't', 'd', 'o', 'g']
答案 1 :(得分:0)
这符合Bertrand Meyer设计的Command–query separation - Wikipedia原则 它声明每个方法应该是执行操作的命令,或者是将数据返回给调用者的查询,而不是两者。