【问题标题】:How to update the list inside a multiple for loop?如何更新多个 for 循环中的列表?
【发布时间】:2019-02-08 17:21:43
【问题描述】:

我想制作一个类似网格的结构并愿意检查地理点是否位于单元格中?

我有坐标元组作为如下所示的元组,我有其他坐标作为列表的列表,其中还包含一些坐标,每个子列表中的坐标数不同。我想用元组中的地理坐标检查子列表内部坐标的每个坐标。因此,我想要每个坐标子列表的 Tuple 大小列表,其值为 1 或 0(基于给定条件)。如果某个坐标的子列表的坐标在data1的坐标范围内,则写1,否则为0。

如果我从坐标子列表中选择一个地理点(6.8, 51.35),我会检查它的每个元组地理坐标,比如 a=(x,y) 修改为 (z=x+0.49, p=y +0.49), 0.49,因为单元间隙为 0.05,然后将值 (6.8, 51.35) 与 (a,b) & (z,p) 的范围进行比较,将值 (x,y) 替换为 1 否则为 0。

Tuple = ((6.8, 51.35), (6.85, 51.4), (6.9, 51.45), (6.95, 51.5), (7.0, 51.55), (7.05, 51.6), (7.1, 51.65), (7.15, 51.7), (7.2, 51.75), (7.25, 51.8), (7.3, 51.85), (7.35, 51.9), (7.4, 51.95), (7.45, 52.0), (7.5, 52.05), (7.55, 52.1), (7.6, 52.15), (7.65, 52.2), (7.7, 52.25), (7.75, 52.3), (7.8, 52.35), (7.85, 52.4), (7.9, 52.45), (7.95, 52.5), (8.0, 52.55), (8.05, 52.6), (8.1, 52.65), (8.15, 52.7), (8.2, 52.75), (8.25, 52.8), (8.3, 52.85), (8.35, 52.9), (8.4, 52.95), (8.45, 53.0), (8.5, 53.05), (8.55, 53.1), (8.6, 53.15), (8.65, 53.2), (8.7, 53.25), (8.75, 53.3), (8.8, 53.35), (8.85, 53.4), (8.9, 53.45), (8.95, 53.5), (9.0, 53.55), (9.05, 53.6), (9.1, 53.65), (9.15, 53.7), (9.2, 53.75), (9.25, 53.8), (9.3, 53.85), (9.35, 53.9), (9.4, 53.95), (9.45, 54.0), (9.5, 54.05), (9.55, 54.1), (9.6, 54.15), (9.65, 54.2), (9.7, 54.25), (9.75, 54.3), (9.8, 54.35), (9.85, 54.4), (9.9, 54.45))

coordinate = [[('9.72', '52.33071'), ('9.72005', '52.3306')],[('9.7909166', '52.353843'), ('9.7907', '52.35399'), ('9.7904', '52.35417'), ('9.7897', '52.35454'), ('9.7891696', '52.354815')]]

我写的代码是

for i in range(0,2):
    list=[]
    point=cordinate[i]
    y=len(cordinate[i])
    print(y)
    for j in range(0,y):
       l=float(point[j][0])
       m=float(point[j][1])
       #list=[]
       for k in range(0,len(Tuple)):
           x=Tuple[k][0]
           y=Tuple[k][1]
           gap = 0.049
           if (x < l < x + gap) and (y < m < y + gap):
               value = 1
           else:
               value = 0
           list.append(value)
   print(list)

电流输出:

2
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

5
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

预期输出应该有大小为 63 的列表,其中包含 0 或 1:

[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

【问题讨论】:

  • 您的描述包括Data1Data2,但这不在您的示例代码中。您的代码还调用了未显示的cordinate。它也不清楚 z 和 pre 的用途。你能稍微简化一下你的例子,只保留你坚持的那一点吗?
  • 欢迎来到 StackOverflow。请按照您创建此帐户时的建议阅读并遵循帮助文档中的发布指南。 Minimal, complete, verifiable example 适用于此。在您发布 MCVE 代码并准确描述问题之前,我们无法有效地帮助您。我们应该能够将您发布的代码粘贴到文本文件中并重现您描述的问题。正如发布指南告诉您的那样,让其他人轻松帮助您。单字母变量名称和缺乏变化的示例使得这很难理解。
  • 您发布的代码仍然无法运行。它仍然很难阅读。你的例子仍然是全零。你真的需要63个输入点来说明你的问题吗??? MCVE 是预期的。
  • 不。 cordinate 未定义(拼写错误)。修复后,我仍然面临其他问题。
  • 我们仍在深入细节。是的,添加两个相同长度的列表很简单。这在网上很多地方都有介绍。这能解决你的问题吗?我仍然不确定您要做什么。将这两个列表相加可能会导致显示的数字更高,这超出了您描述的问题并且超出了您的编码尝试。我会等待问题规范和 MCVE。

标签: python python-3.x list loops


【解决方案1】:

你有三个问题。前两个是相关的:Vic 指出无论内部if 是否为True,都会执行您的“else”子句。为了简化检查,升级你的差距检查代码

gap = 0.049
if (x < l < x + gap) and \
   (y < m < y + gap):
    value = 1
else:
    value = 0

list.append(value)

这也解决了您的第二个问题:在“找到”的情况下,您将附加 value 两次:一次在 if 内,然后一次。

另外,请注意,您可以将该支票减少到一项长项目:

list.append(int((x < l < x + gap) and (y < m < y + gap)))

最后,您遇到了一个问题,即您的数据不会根据设计产生任何1 值。您已经定义了一系列对角线单元格。第一个具有 (6.8, 51.35) 和 (6.849, 51.399) 的对角角;下一个在第二个拐角处拾取并沿网格的对角线继续。

coordinate 中的点不属于这些单元格中的任何一个。比如第一点是

(9.72, 52.33071)

包含x坐标的网格(Tuple)点是

(9.7, 54.25), (9.75, 54.3)

但所需的y 坐标比该点高近两个单位(40 步)。因此,该点没有匹配的单元格。其他坐标点也有同样的问题。您根本没有任何符合条件的数据点,因此您的输出列表将全为零。

您的数据或问题描述似乎有问题。

【讨论】:

  • 我在坐标中有很多点,对于 k in range(0,len(Tuple)): x=Tuple[k][0] y=Tuple[k][1] gap=0.05 list .append(int((x
  • 我不清楚你的说法“我有很多坐标点”。正如我在回答中所描述的,这些点都不在您定义的对角线单元格内。
  • 最后一次:请编辑您的问题以作为 MCVE。不要在 cmets 中发布代码。在您的问题下发布澄清,而不是在答案下。
  • 我已根据您的建议更新了代码和输出,输出中 0 的数量取决于 coridantes[i] 中的点数...对于 2,对于 5 其 126 其 315。有什么解决办法吗?
【解决方案2】:

Gautam 我同意上面关于 MCVE 提交的 cmets。根据您发布的代码,您可能希望查看的一个地方是您的 4 参数 if 语句:

    if l>x and l<z:
      if m>y and m<p:
        value=1
    else : value = 0

您可能从这段代码中得到了不需要的输出,因为您的 else 语句每次迭代都会执行。

【讨论】:

  • 根据您最新提交的内容,您希望输出为 1 或 0。但我在上面发布的代码总是将您的值引导至 0。当 l>x 和 l
  • 不错,我的坐标点很多,这里发不出来,担心输出一个列表,每个坐标子列表必须只有一个大小元组列表跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-04
  • 2021-07-01
  • 2019-08-04
  • 2020-11-27
  • 2020-06-07
  • 2023-02-08
相关资源
最近更新 更多