【发布时间】:2017-03-20 12:29:48
【问题描述】:
我想遍历两个同样长的集合,并确定每个集合中的元素是否也在一个数组中。
这是一个我已经解决的 Hackerrank 问题。但是,我正在使用 Hackerrank 来进一步了解 Python。我一直在学习列表理解,虽然我确实相信我如何尝试使用它被认为是糟糕的生产代码,但我仍然想根据自己的知识探索语言语法的可能性。
这是设置它的代码:
n, m = map(int, input().split())
arr = list(map(int, input().split()))
A = set(map(int, input().split()))
B = set(map(int, input().split()))
任务是为 A 和 arr 中的每个元素输出一个值为 +1 的整数,为 B 和 arr 中的每个元素输出 -1。
示例输入:
3 2
1 5 3
3 1
5 7
样本输出:
1
这样就达到了要求的结果:
print(sum([1 for a in A if a in arr]) + sum([-1 for b in B if b in arr]))
但是,这更接近我想要实现的目标:
sum([1 if a in arr else -1 if b in arr for a, b in zip(A, B)])
编辑(实际上更接近):
print(sum(1 if a in arr -1 if b in arr for a, b in zip(A, B)))
正如您所见,两者都是单行代码,因此不是要尝试减少代码,而是要了解列表理解和 Python 代码的可能性。如果这是不可能的,甚至是不好的做法,我也很感兴趣。
这是 Hackerrank 链接: https://www.hackerrank.com/challenges/no-idea
【问题讨论】:
-
如果要立即将列表转换为集合,为什么要完全使用列表理解?您可以改用集合推导。
-
顺便说一句,我认为你不需要列表推导,如果我记得很清楚
sum()接受任何可迭代的,因此你可以删除[]并将其传递给生成器。 -
@spectras 我不知道。我将在没有列表理解的情况下尝试它。我也刚刚注意到
else if不正确,因为它应该是两个if语句,因此即使第一个条件不正确,也会检查第二个条件 -
我正在重新阅读,我认为试图同时做两个总和有点误导,因为你是从不同的容器中总结不同的东西。不仅它不起作用(不以奇怪的方式扭曲数据),而且从逻辑的角度来看它也没有意义。
标签: python list conditional list-comprehension