【问题标题】:Is the if statement condition mutually-exclusive to multiple variables?if 语句条件是否对多个变量互斥?
【发布时间】:2017-03-24 17:17:11
【问题描述】:

假设我有三个列表,并且想要将所有整数元素添加到名为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 语句合并为一个条件语句吗?或者减少代码?有没有更蟒蛇的方式来做到这一点? 我尝试执行以下代码,但它会包含不是整数的元素:

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)

【问题讨论】:

  • 这将不附加所有整数本身,因为zip 将从列表之一完成的那一刻起停止...
  • 此外elem1 is int 不起作用

标签: python if-statement multiple-conditions


【解决方案1】:

您的代码存在一些问题

  1. zip 构造元素的元组只要所有列表都有元素,如果其中一个列表用完,zip 停止;
  2. elem1 is int 不做类型检查,它做引用相等检查,你可以使用isinstance(..);和
  3. 正如@Jean-FrançoisFabre 所说,if (...)总是成功,因为您使用包含一个或多个元素的元组对其进行测试:无论该元组的值如何,真实性 em> 是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)]

【讨论】:

  • 您的“使用生成器”示例中没有生成器。
  • @user2357112:是的,最初我想使用生成器将它们链接在一起,但中途我改变了主意。
  • (elem1 is int, elem2 is int, elem3 is int) 总是 True 因为它是一个非空元组。
【解决方案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)

【讨论】:

    猜你喜欢
    • 2015-07-08
    • 2019-09-21
    • 2018-03-09
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多