使用extend方法连接列表

时间:2018-04-06 07:22:32

标签: python

假设这样一个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单线完成?

2 个答案:

答案 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原则 它声明每个方法应该是执行操作的命令,或者是将数据返回给调用者的查询,而不是两者。

Design by contract - Wikipedia

Fluent interface - Wikipedia

相关问题