我是python的新手。我在Hackerrank https://www.hackerrank.com/challenges/maximize-it/problem上解决了一个问题。
我无法解决问题,所以我打开了讨论。我在那里找到了一个代码 -
from itertools import product
K,M = map(int,input().split())
N = (list(map(int, input().split()))[1:] for _ in range(K))
results = map(lambda x: sum(i**2 for i in x)%M, product(*N))
print(max(results))
我有两个疑问:
results=map(lambda x: sum(i**2 for i in x)%M, product(*N))
。我理解product(*N)
的作用。但是sum(i**2 for i in x)%M
的输出是什么?是添加列表值的平方然后执行模数运算吗?还是别的什么?
答案 0 :(得分:0)
为什么N是生成器?
list
函数正在应用于map(int, input().split())
语句,实际上这是一个返回的列表,但是,最外面的一对括号和for _ in range(K)
表示正在生成一个生成器对象返回N
而不是列表。如果要在调试时查看N的内容,请将最外面的括号更改为方括号[
和]
,然后在其后添加print(N)
语句:
# Debug & view contents of N like this:
N = [ list(map(int, input().split()))[1:] for _ in range(K) ]
print(N)
变量results
的价值是如何产生的?
正如所有正在阅读这个答案的人都清楚,在下面的例子中,我会让:
N = [[1, 2], [3, 4], [5, 6]]
product(*N)
将返回一个迭代器,用于包含N的每个子列表的笛卡尔积的元组列表,例如product(*N)
返回元组(1, 3, 5), (1, 3, 6), (1, 4, 5), (1, 4, 6), ..., (2, 4, 6)
。
您可以通过执行print([x for x in product(*N)])
或在for循环中迭代N
并按原样打印出每个值来验证这一点:
N = [[1, 2], [3, 4], [5, 6]]
# You can verify the contents of a generator like this:
print([item for item in product(*N)])
# Or like this:
for item in product(*N):
print(item)
分解results = map(lambda x: sum(i**2 for i in x)%M, product(*N))
:
在(i**2 for i in x)
中,x
指的是其中一个元组,例如(1, 3, 5)
中的product(*N)
,并返回包含值(1, 9, 25)
的生成器。所以它基本上是对齐元组(1, 3, 5)
中的每个整数并返回它们的正方形元组。
sum(i**2 for i in x)
对元组x
中的每个整数求和,得到1 + 9 + 25 = 35.
之后,结果总和35应用于模数运算% M
。
最后,results
将包含生成器,其中包含每个元组的所有结果模数和。同样,您可以通过results
验证print([x for x in results])
的内容,或者如果您在for循环中迭代results
并打印出每个值,就像在上面的代码段中完成它一样。< / p>
print(max(results))
会在results
中为您提供最大值。
(我假设使用了Python-3.x。)