【问题标题】:Understanding; for i in range, x,y = [int(i) in i.... Python3理解;对于范围内的 i,x,y = [int(i) in i .... Python3
【发布时间】:2017-01-01 01:47:16
【问题描述】:

我一直试图理解这种组合输入()、循环和列表理解背后的机制;来自 Codegaming 的“MarsRover”谜题。该序列创建了一条 2D 线,表示在 6999 单位宽(x 轴)的区域中的拓扑的切口。

可以理解,我最初的问题被搁置了,因为太宽泛了。我试图缩短和缩小问题:我基本上了解列表理解,并且我对 for 循环很有经验。

点赞列表:

 land_y = [int(j) for j in range(k)]
    if k = 5;    land_y = [0, 1, 2, 3, 4]

for循环:

for i in the range(4) 
    a = 2*i       = 6
    ab.append(a)  = 0,2,4,6

但是在这里,它并没有加起来(在我的脑海中): 从 6 个点 (x,y) 沿 x 轴创建 6999 个点。

  surface_n = int(input()) 
  for i in range(surface_n):

      land_x, land_y = [int(j) for j in input().split()]

我不明白“i”在哪里有所作为。 我不明白输入中的数据是如何“打包”的。我在几乎完全相同的代码中在另一个任务上拆分了整数字符串,并且我可以轻松地创建新列表并使用它们 - 因为我了解我正在解包的结构(非常简单的是一种具有一个目的的数据类型)。

这条线在“游戏”-while-循环中的事实让我更加困惑,因为它会随着游戏状态的变化而动态更新。

   x, y, h_speed, v_speed, fuel, rotate, power = [int(i) for i in input().split()]

也许有人可以举例说明如何用 javascript、haskell 或 c# 编写它?不需要语法正确,我只是在这里为这个概念而苦苦挣扎。

【问题讨论】:

  • 如果你刚开始接触Python,我建议你关注一些其他的代码;有人在这里打代码,这里有太多东西需要解释。抱歉,这对于 Stack Overflow 来说太宽泛了。
  • input() 从标准输入中获取一行text;此代码需要空格分隔的数字,然后将其转换为整数列表。因此,脚本标准输入上的42 81 将被拆分为['42', '81'],列表推导在其上循环并生成[42, 81],然后将元素分配给两个变量。其他表达式也一样,只是现在要输入 7 个数字。
  • 嘿,我很明白,很抱歉打扰了。无论如何,感谢您的回答。我已经将它缩短并指定了一点,但我不想成为 nouicanse。我尊重如果它仍然不合格。

标签: list loops python-3.x list-comprehension


【解决方案1】:

input() 从标准输入中取出一行。所以它本质上是在你的程序中读取一些价值。

代码的工作方式是对输入字符串的格式做出非常严格的假设。以至于它变得令人困惑(并且难以验证)。

我们先来看看这一行:

land_x, land_y = [int(j) for j in input().split()]

您说您已经了解列表理解,所以这本质上等于:

inputs = input().split()
result = []
for j in inputs:
    results.append(int(j))
land_x, land_y = results

这是这里发生的多种事情的组合。 input() 将一行文本读入程序,split() 将该字符串分成多个部分,只要出现空白字符就将其拆分。所以一个字符串'foo bar'被拆分成['foo', 'bar']

然后,列表推导发生,它本质上只是遍历分割后的输入字符串中的每个项目,并使用int(j) 将每个项目转换为整数。所以'2 3' 的输入首先转换为['2', '3'](字符串列表),然后再转换为[2, 3](整数列表)。

最后,评估行land_x, land_y = results。这称为iterable unpacking,本质上假设右侧的可迭代项与左侧的变量数量完全相同。如果是这种情况,那么编写以下内容只是一种不错的方式:

land_x = results[0]
land_y = results[1]

所以基本上,整个列表理解假设输入的两个数字由空格分隔,然后将它们拆分为单独的字符串,将它们转换为数字,然后将每个数字分配给单独的变量 land_x 和 @987654337 @。

同样的事情稍后会再次发生,如下行:

x, y, h_speed, v_speed, fuel, rotate, power = [int(i) for i in input().split()]

只是这一次,它期望输入有七个数字,而不是只有两个。但后来就完全一样了。

【讨论】:

    猜你喜欢
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    相关资源
    最近更新 更多