【问题标题】:Can anyone tell me what is wrong with this list comprehension?谁能告诉我这个列表理解有什么问题?
【发布时间】:2020-04-17 03:25:11
【问题描述】:

我只是在学习如何进行列表推导。我被问到这个问题:

给定一个数字列表,返回所有偶数加倍的列表,所有奇数 数字变为负数。

>>input_list=[72, 26, 79, 70, 20, 68, 43, -71, 71, -2]

这是我编写的代码,但我不确定为什么会收到“错误输入”错误:

output_list = [i * -1 if i < 0 if i%2==1 else i * 2 for i in input_list]

谁能告诉我我的代码有什么问题?

【问题讨论】:

  • 为什么你有两个ifs,你为什么要检查i &lt; 0?任务没有说你需要对负数做任何不同的事情。
  • 我想如果“奇数变为负数”的意思是“将符号设置为负数”而不是“负数”,您可能会以不同的方式处理负输入,但这不是您的做法(也是如此) d 更容易使用-abs(i))。
  • 我建议看看这个:stackoverflow.com/a/15248309/10798048
  • 这能回答你的问题吗? if/else in a list comprehension?
  • python 中的map,lambda 函数仅用于处理上述情况。看看python.org/dev/peps/pep-0308

标签: python python-3.x


【解决方案1】:

如果它是一个奇数的负数,我假设你根本不想改变这个数字:

output_l = [x*2 if x % 2 == 0 else x*-1 if x > 0 else x for x in input_list]

这里的关键是在列表推导中使用两个条件。第一个将检查是否将数字加倍(如果是偶数),第二个将检查是否否定该数字(如果它是奇数正数)或者如果已经为负数则保持原样。

请记住,您不能按顺序添加两个 if 语句。您必须在两者之间定义一个else

【讨论】:

  • 谢谢,它成功了。这正是我想要做的。知道我必须在两者之间进行定义非常有帮助哈哈
【解决方案2】:

试试这个

input_list = [72,26,79,70,20,68,43,-71,71,-2]
output_list=[ x*2 if x%2==0 else -1*abs(x) for x in  input_list]
print(output_list)

or :[false,true][condition] 是语法:

input_list = [72,26,79,70,20,68,43,-71,71,-2]
output_list=[[-1*abs(x),x*2] [x%2==0] for x in  input_list]
print(input_list)
print(output_list)

【讨论】:

    【解决方案3】:

    你的答案是在这个问题中给出的:if/else in a list comprehension?

    input_list = [72, 26, 79, 70, 20, 68, 43, -71, 71, -2]
    output_list = [i*2 if i % 2 == 0 else abs(i) * -1 for i in input_list]
    print(output_list)
    

    如果您使用的是 if 和 else 这是如何格式化它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 2021-09-06
      • 2017-12-11
      • 2011-01-07
      • 2018-05-15
      • 2011-04-08
      • 2018-10-25
      相关资源
      最近更新 更多