【问题标题】:Add a list and an iterator to form a new list添加列表和迭代器以形成新列表
【发布时间】:2018-02-22 02:55:44
【问题描述】:

我试过了:

a_list = [1,2,3]
b_list = [4,5]
...

call_function(a_list + iter(b_list))  # TypeError

还有比这更好的代码吗:

a_list = [1,2,3]
b_list = [4,5]
...

new_list = a_list[:]
new_list += iter(b_list)  # no TypeError?
call_function(new_list)

考虑任何迭代器,我使用islice 代替iter

【问题讨论】:

  • 为什么不new_list = a_list + b_list
  • 请看最后一行
  • @BearBrown:b_list 仅用于构造可迭代/迭代器... Afaik 您应该将其视为黑盒可迭代/迭代器。

标签: python list iterator iterable


【解决方案1】:

,可以使用可迭代解包

call_function([<b>*</b>a_list, <b>*</b>iter(b_list)])

这是因为:

>>> [*a_list, *iter(b_list)]
[1, 2, 3, 4, 5]

注意a_listiter(b_list) 前面的星号(*)。此外,a_list 只需 finite 可迭代/迭代器。因此,您可以简单地构造一个将有限迭代连接在一起的列表。

【讨论】:

    【解决方案2】:

    您可以一般使用itertools.chain 加入可迭代对象:

    from itertools import chain
    
    new_list = list(chain(a_list, iter(b_list))) 
    print(new_list)
    # [1, 2, 3, 4, 5]
    

    【讨论】:

      【解决方案3】:

      现有答案已经解决了解决方法。此外,这一行:

      new_list += iter(b_list)
      

      不会抛出错误,因为它调用了支持添加迭代器的list.__iadd__

      【讨论】:

        【解决方案4】:

        您可以使用__iadd__(),它是由语法糖+= 触发的真正函数(这就是它不会产生错误的原因)。

        call_function(a_list.__iadd__(iter(b_list)))
        

        生产

        >>> a_list.__iadd__(iter(b_list))
        [1, 2, 3, 4, 5]
        

        这很有趣,但说实话在可读性方面并不是很好。更喜欢其他答案:)

        编辑

        当然要生成new_list,你必须复制list_a,你在你的问题中做过吗。

        a_list[:].__iadd__(iter(b_list))
        

        【讨论】:

        • 我的意思是创建一个新列表(有问题的标题)。不过,我没有在问题正文中指定它
        • @Adam 是有道理的。编辑答案,但它非常接近您原始问题中的代码。
        猜你喜欢
        • 2012-10-11
        • 2015-05-16
        • 2020-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-31
        • 1970-01-01
        • 2011-07-19
        相关资源
        最近更新 更多