假设我有三个列表,并希望将所有整数元素添加到名为int_list
的列表中:
test1 = [1, 2, 3, "b", 6]
test2 = [1, "foo", "bar", 7]
test3 = ["more stuff", 1, 4, 99]
int_list = []
我知道我可以执行以下代码将所有整数附加到新列表中:
for elem1, elem2, elem3 in zip(test1, test2, test3):
if elem1 is int:
int_list.append(elem1)
if elem2 is int:
int_list.append(elem2)
if elem3 is int:
int_list.append(elem3)
无论如何我可以将if语句合并到一个条件语句中吗?或者减少代码?是否有更多的pythonic方式来做到这一点? 我尝试执行以下代码,但它将包含非整数的元素:
for elem1, elem2, elem3 in zip(test1, test2, test3):
if (elem1 is int, elem2 is int, elem3 is int):
int_list.append(elem1)
int_list.append(elem2)
int_list.append(elem3)
答案 0 :(得分:2)
您的代码存在一些问题:
zip
构建元素元组,只要所有列表都有元素,如果其中一个列表用完,zip
停止; elem1 is int
不进行类型检查,它执行引用相等性检查,您可以使用isinstance(..)
;和if (...)
将始终成功,因为您使用包含一个或多个元素的元组对其进行测试:无论该元组的值是什么真实性是True
。为什么不先加入他们?例如,您可以使用列表的元组,例如:
for sublist in (test1,test2,test3):
for x in sublist:
if isinstance(x,int):
int_list.append(x)
或者你可以使用列表理解:
int_list = [x for sublist in (test1,test2,test3)
for x in sublist if isinstance(x,int)]
答案 1 :(得分:2)
您使用zip
,但需要itertools.chain()
。另外you should use isinstance
to check class membership。
from itertools import chain
for elem in chain(test1, test2, test3):
if isinstance(elem, int):
int_list.append(elem)