这行代码的作用是什么?

时间:2018-03-06 01:22:53

标签: python python-3.x list

我是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))

我有两个疑问:

  1. 首先,如果我尝试打印N,它会抛出"生成器对象不可订阅"错误,但该值已经转换为列表,因此我无法理解错误的原因。
  2. 我无法理解results=map(lambda x: sum(i**2 for i in x)%M, product(*N))
  3. 会存储的内容

    我理解product(*N)的作用。但是sum(i**2 for i in x)%M的输出是什么?是添加列表值的平方然后执行模数运算吗?还是别的什么?

1 个答案:

答案 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。