添加列表和迭代器以形成新列表

时间:2017-09-13 11:50:59

标签: python list iterator iterable

我试过了:

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

4 个答案:

答案 0 :(得分:4)

中,您可以使用 iterable unpacking

call_function([*a_list, *iter(b_list)])

这是有效的:

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

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

答案 1 :(得分:3)

通常使用itertools.chain加入iterables:

from itertools import chain

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

答案 2 :(得分:1)

现有答案已经解决了这个问题。另外,这一行:

new_list += iter(b_list)

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

答案 3 :(得分:1)

你可以使用__iadd__()这是语法糖 namespace PrintCustomerList { // Import newly generated Web service proxy. using System; using System.Collections.Generic; using System.Text; using System.Net; using kenedy; using System.Diagnostics; using System.Xml; class Program { static void Main(string[] args) { var service = new Customer_Service(); service.UseDefaultCredentials = true; service.Credentials = System.Net.CredentialCache.DefaultCredentials; service.Url = "http://..:7047/DynamicsNAV90/WS/..%20LIMITED/Page/Customer"; // Create instance of customer. Customer custArray = new Customer(); XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load("C:\\Users\\..\\Desktop\\Product.xml"); var nodeList = xmlDoc.DocumentElement.SelectNodes("/Table/Product"); for(var i = 0; i < nodeList.Count; i++) { foreach (XmlNode node in nodeList) { custArray.Address = node.SelectSingleNode("Product_id").InnerText; custArray.Name = node.SelectSingleNode("Product_name").InnerText; custArray.Address_2 = node.SelectSingleNode("Product_price").InnerText; Console.WriteLine(custArray.Name); } } Console.WriteLine("Records Inserted"); Console.WriteLine("End of Customers"); Console.WriteLine("Press [ENTER] to exit program!"); Console.ReadLine(); service.Create(ref custArray); // service.Update(ref custArray); //service.CreateMultiple(ref custArray); // Create instance of service and set credentials. } } 的真正功能触发器(这就是为什么它不会产生错误)。

+=

农产品

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

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

修改

当然要制作new_list,你必须在问题中复制>>> a_list.__iadd__(iter(b_list)) [1, 2, 3, 4, 5]

list_a