【问题标题】:Concatenate lists with extend method使用扩展方法连接列表
【发布时间】:2018-04-06 07:22:31
【问题描述】:

假设这样一个包含多个项目的字典:

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 方法?

【问题讨论】:

  • extend 方法更新现有列表(调用extend 的列表)并返回None
  • extend就地修改列表,extend的返回值为None
  • TypeError: list() 最多接受 1 个参数(给定 2 个)@Norrius
  • @Tool 如果你想要一个单行,应该这样做:import itertools; list(itertools.chain(*d.values()))Docs. 请注意,.values() 中的元素顺序可能没有明确定义。

标签: python


【解决方案1】:

直接回答:你想要的结果不能用extend一行来构造

正如评论extend 中已经提到的许多修改列表并返回无。

您没有得到结果,因为您写道: [].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']

【讨论】:

    【解决方案2】:

    这符合 Bertrand Meyer 设计的Command–query separation - Wikipedia 原则。
    它指出每个方法都应该是执行操作的命令,或者是向调用者返回数据的查询,但不能同时是两者。

    Design by contract - Wikipedia

    Fluent interface - Wikipedia

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 2016-10-21
      • 2014-03-04
      • 2020-10-03
      • 2010-10-09
      相关资源
      最近更新 更多