蟒蛇|列表理解 |多个标准

时间:2021-03-07 22:43:10

标签: python list

用例

我正在尝试使用多个列表推导式来创建一个包含元素并满足以下条件的列表。

第 1 步:所有元素都是 1 到 30(含)之间的整数。所有元素都不能被 2 或 5 整除。打印出列表并移至下一步。

第 2 步:将所有能被 3 整除的元素转换为它们的对立元素(例如 3 到 -3)和 打印出新列表(第 2 步列表)。

第3步:将第2步列表中所有正元素的值相加并打印出结果

我的代码

步骤 1:为 1 到 30 之间不能被 2 或 5 整除的所有整数创建一个列表表达式。打印出列表

list1 = [a for a in range(1, 31) if a%2 == 1 & a%5 == 1]
print(f"My initial list is: {list1}")

第 2 步:将所有可被 3 整除的整数转换为其相反数

list2 = [-abs(b), c for b in list1 if b%3 == 0 else ]
print(f"My step-2 list is: {list2}")

这就是我被卡住的地方。我如何打印 list1 中的所有整数,其中任何可被 3 整除的整数变为负数(例如,3 变为 -3)并且所有剩余的不能被 3 整除的整数为积极的?这就是我想要实现的逻辑。

如果我使用下面的代码,它会返回一个正确的 [-3, -21] 列表。但是,我没有看到列表中剩余的不能被 3 整除的正整数。

list2 = [-abs(b) for b in list1 if b%3 == 0]
print(f"My step-2 list is: {list2}")

第 3 步:将第二个列表中的所有正值相加并打印出结果

list3 = [sum(c) for c in list2 if c > 0]
print(f"The sum of positive elements in my step-2 list is: {list3}")

我相信一旦我修复了 list2 的代码,list3 的代码应该可以工作。任何帮助表示赞赏。谢谢。

2 个答案:

答案 0 :(得分:1)

您需要将条件值放在列表理解中的项目中,而不是对其进行过滤,即:

list2 = [-b if b % 3 == 0 else b for b in list1]

遍历列表中的每一项,如果能被 3 整除,则返回其负值,否则返回数字本身。

对于第三步,您可能不再需要一个列表(并且提议的构造在语法上是无效的)并且实际上说:

result = sum(i for i in list2 if i > 0)

转发其他人指出的评论:在第一步中,逻辑和运算符是 and 而不是 &(这是一个按位运算符)。对于不能被 n 整除的情况,就像在您的第二步中一样,您应该检查模块 is not 0 并且不是 is 1

答案 1 :(得分:1)

您可以考虑针对您的目标进行此修复和建议: 对于第 3 步的列表推导可以保留正数,但需要另一个函数,如 sum(..),否则也可以使用 reduce(..) 函数:

list1 = [a for a in range(1, 31) if a%2 != 0 and a%5 != 0]
print(f"My initial list is: {list1}")

list2 = [-abs(b) if b%3==0 else b for b in list1 ]
print(f"My step-2 list is: {list2}")

list3 = [x if x>0 else 0 for x in list2 ]
print(f"My step-3 list is: {list3} and sum is: {sum(list3)}")


My initial list is: [1, 3, 7, 9, 11, 13, 17, 19, 21, 23, 27, 29]
My step-2 list is: [1, -3, 7, -9, 11, 13, 17, 19, -21, 23, -27, 29]
My step-3 list is: [1, 0, 7, 0, 11, 13, 17, 19, 0, 23, 0, 29] and sum is: 120

仅供参考,如果需要,您可以一步完成最后的求和:

list4 = [a  if a%2 != 0 and a%5 != 0 and a%3!=0 else 0 for a in range(1, 31)]
print(f"One step list is: {list4} and sum is: {sum(list4)}")

One step list is: [1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 11, 0, 13, 0, 0, 0, 17, 0, 19, 0, 0, 0, 23, 0, 0, 0, 0, 0, 29, 0] and sum is: 120