【问题标题】:finding coordinates in python在python中查找坐标
【发布时间】:2012-10-14 23:34:54
【问题描述】:

所以我有这个任务,我得到了一个“地图”

island = \
['     /---------\       ',
 '     |     x    \      ',
 '     /           \--\  ',
 '    /   x            | ',
 '    |         x      | ',
 '     \               \ ',
 '      \  x  /\/\     / ',
 '       \---/    \   |  ',
 '                /--/   ']

编写一个程序,计算岛上宝物的数量(x 表示地点)并创建坐标列表,例如[(1,11), ...] ((1,11)是例子中最上面的宝物的实际位置),然后打印出一个报表,格式为:有3个宝物。 (1,11) 处有宝藏。在...处有一个宝藏。提示:从第 i 行第 j 列中的符号的(非常短的)表达式开始。

编写一个计算海岸线长度的程序。假设'-''|'1 mile'\''/'1.4 miles。 (这只是一个非常粗略的估计,原因有很多,其中一些是数学的)。

我什至不知道从哪里开始......有人可以帮助我或至少为我指明正确的方向吗?

【问题讨论】:

  • 如果宝藏在海里呢?
  • length of coastline问题的答案是什么?
  • @AshwiniChaudhary: 21 + 20*1.4
  • @Eric 谢谢,得到了同样的答案。

标签: python map coordinates


【解决方案1】:

您要做的第一件事是遍历数组

for column, line in enumerate(island):
    print column, line

这给了你

0      /---------\       
1      |     x    \      
2      /           \--\  
3     /   x            | 
4     |         x      | 
5      \               \ 
6       \  x  /\/\     / 
7        \---/    \   |  
8                 /--/  

好的,那么在每一行上水平迭代怎么样?完全一样:

for column, line in enumerate(island):
    for row, cell in enumerate(line):
        print "entry at", row, column, "is", cell

警告:输出过长!

这应该足以让你开始

【讨论】:

  • +1 没有给出确切的解决方案,而是一个很好的建议,因为问题显然是家庭作业类型的
  • 为此+1,另外他还可以使用像{'\\':1.4,'/':1.4,'-':1,'|':1} 这样的字典来简化他的工作,同时计算距离。
【解决方案2】:

由于人们发布了完整的解决方案,这里有一个 Pythonic 但不高级的解决方案。

segment_lengths = {'\\':1.4,'/':1.4,'-':1,'|':1}
coast_len = 0
treasure_coords = []
for y, line in enumerate(island):
    for x, c in enumerate(line):
        coast_len += segment_lengths.get(c, 0)
        if c == 'x':
            treasure_coords.append((y, x))
print len(treasure_coords), 'treasures found at', treasure_coords
print 'island coast length is', coast_len

打印:

4 treasures found at [(1, 11), (3, 8), (4, 14), (6, 9)]
island coast length is 49.0

编辑:J.F. Sebastian offers 基于 if-elif 的解决方案:

coast_length = 0
treasure_coords = []
for y, row in enumerate(island):
    for x, c in enumerate(row):
        if c in r'\/':
            coast_length += 1.4
        elif c in '-|':
            coast_length += 1
        elif c == 'x':
            treasure_coords.append((y, x))

print("There are %d treasures." % (len(treasure_coords),))
for y, x in treasure_coords:
    print("There is a treasure at (%2d, %2d)." % (y, x))
print("The length of the coastline is %.1f." % (coast_length,))

【讨论】:

  • 我可以更pythonic:treasure_coords = [(x, y) for y, row in enumerate(island) for x, c in enumerate(row) if c == 'x']sum(1 if c in ('-', '|') else 1.4 if c in ('/', '\\') else 0 for x in ''.join(island))
  • @Eric:我避免使用嵌套列表理解,因为它更高级。此外,这意味着您必须迭代两次,一次用于坐标,然后再次用于海岸长度。
  • 确实如此。你的可能是正确的简单程度。不确定字典是否比这里的一对 if 更清晰。
  • @Eric:另外,从什么时候开始单线-itis Pythonic? (我作为一个慢性单线炎患者问这个问题。)
  • 这是我可以在评论框中输入的最 Pythonic 的东西。这使它成为pythonic,对吧?
【解决方案3】:

为了发布(半pythonic)解决方案:

# reads as it means - coords where the cell is "x"
treasure_coords = [
    (x, y) for y, row in enumerate(island)
           for x, c in enumerate(row)
           if c == 'x'
]

# slightly more cryptic
coast_length = sum(
    1   if c in '-|'  else
    1.4 if c in '/\\' else
    0
    for c in ''.join(island)
)

【讨论】:

    【解决方案4】:

    非常简单的方法就是遍历每个字符(记录当前的 col/row_ 并检查它是否为 'x' 或海岸符号之一。就像这样:

    length = 0.0
    x = 0
    y = 0
    for line in island:
        x += 1
        y = 0
        for char in line:
            y += 1
            if char == 'x': print 'There is a treasure at (%d,%d)' % (x, y)
            elif char in ('-', '|'):
                length += 1
            elif char in ('\\', '/'):
                length += 1.4
    print 'Coast length is', length
    

    当然它不检查海中的宝藏、海岸的完整性等。

    【讨论】:

    • 这个很不合python,返回的坐标也是错误的。
    • 这非常有用...但是由于某种原因坐标偏离了 1?而不是 1, 11 例如答案是 2,12 ...您还建议使用什么来计算有多少 x?所以它说“有4个宝藏”?我认为 .count 行不通,不是吗?
    • 坐标取决于什么是零点(第一行的第一个字符)。就我而言,它是 1,1,而不是 0,0。是的,它是非pythonic,但我希望它可读且简单......至于以“unpythonic”方式计算宝藏,只需在打印出宝藏的地方执行num_treasures += 1
    【解决方案5】:

    要得到海岸线的长度,你只需要统计每个海岸字符的实例。

    >>> from itertools import groupby
    >>> dict([(k, len(list(g))) for k, g in groupby(sorted(''.join(island)))])
    {' ': 162, '-': 16, '/': 9, '\\': 11, 'x': 4, '|': 5}
    

    然后你可以把它们加起来:

    >>> char_counts = dict([(k, len(list(g))) for k, g in groupby(sorted(''.join(island)))])
    >>> char_counts['-'] + char_counts['|'] + 1.4 * (char_counts['/'] + char_counts['\\'])
    49.0
    

    【讨论】:

    • 即使 OP 没有要求提供代码,他也想要一些提示而不是编码的答案。
    • 其实他说的是“写一个程序”。最后一行很清楚,他希望得到任何帮助。
    • @DRead:这并不意味着你应该做他的任务
    • 为什么不呢?如果他复制我的解决方案对他来说可能不道德,但我更有兴趣很好地回答提出的问题。我希望好的解决方案得到标记,而不是模糊的提示。
    【解决方案6】:

    海岸线部分长度的 Pythonic 解决方案:

    In [144]: strs
    Out[144]: 
    ['     /---------\\       ',
     '     |     x    \\      ',
     '     /           \\--\\  ',
     '    /   x            | ',
     '    |         x      | ',
     '     \\               \\ ',
     '      \\  x  /\\/\\     / ',
     '       \\---/    \\   |  ',
     '                /--/   ']
    
    In [145]: dic={'\\':1.4,'/':1.4,'-':1,'|':1}
    
    In [146]: sum(dic.get(y,0) for x in strs for y in x)
    Out[146]: 48.999999999999979
    

    In [149]: sum(map(lambda x:dic.get(x,0),chain(*strs)))
    Out[149]: 48.999999999999979
    

    或(如 Eric 所建议):

    In [197]: sum(dic.get(x,0) for x in chain(*strs))
    Out[197]: 48.999999999999979
    

    坐标:

    In [185]: [(i,m.start()) for i,x in enumerate(strs) for m in re.finditer('x',x)]
    Out[185]: [(1, 11), (3, 8), (4, 14), (6, 9)]
    

    【讨论】:

    • 认为这可能会跨越 pythonic/cryptic 边界。另外,我更喜欢sum(dic.get(x,0) for x in chain(*strs))
    • @Eric 这个也不错,我的坐标解决方案在时间上胜过你的。
    【解决方案7】:

    二维网格很容易用某种数组表示。创建一个数组,以您了解如何查找该数组中的坐标 x,y 的方式存储所有网格。

    通过遍历数组的索引来检查所有宝藏。

    海岸线只是一个周长测量值,但它的表示要简单得多,您找到的每个字符都相当于某个数字。再次运行循环,寻找这些角色,当你遇到它们时,增加一些海岸线的运行总和。

    *您可以在一个循环中或以其他简单的方式完成所有这些操作...最好的方法是将其分解为多个部分,以便您了解如何执行此操作。

    【讨论】:

    • “海岸线只是一个直径测量” - 这是一个非常奇怪的圆圈......
    【解决方案8】:

    我是python的初学者,这个问题很有趣,我对这个问题的解决方案如下: 感谢@Eric 提供了一个开始的想法

    island = \
    ['     /---------\       ',
     '     |     x    \      ',
     '     /           \--\  ',
     '    /   x            | ',
     '    |         x      | ',
     '     \               \ ',
     '      \  x  /\/\     / ',
     '       \---/    \   |  ',
     '                /--/   ']
    Distance={
        "-":1.0,
        "|":1,
        "\\":1.4,
        "/":1.4
    }
    Treasure_Location = []
    Miles = []
    for row, line in enumerate(island):
        #print(row, line)
    
        for column, cell in enumerate(line):
            if cell== "x":
                Treasure_Location.append((row, column))
    
            if cell in Distance:
                z=Distance.get(cell)
                Miles.append(z)
    
    Total_miles= sum(Miles)
    
    print ("Co-ordinates of the Treasure in the Island are:\n")
    print("\nTreasure 1: " + str(Treasure_Location[0]))
    print("\nTreasure 2: " + str(Treasure_Location[1]))
    print("\nTreasure 3: " + str(Treasure_Location[2]))
    print("\nTreasure 4: " + str(Treasure_Location[3]))
    print("\nThe length of the Coastal line is:"+str(Total_miles))
    

    【讨论】:

      【解决方案9】:

      由于每一行都是列表中的一个值,因此您可以使用简单的“in”检查来查看是否有宝藏。

       for line in island:
           if 'x' in island[line]:
               print '%d,%d' %line,island[line].index('x')
      

      轻松获取电源线。

      【讨论】:

      • 为什么不简单地for line in island
      • 变量x从何而来?你的意思是line?如果一行中有两个 x 怎么办?
      • 我认为这并不完全正确。 if 'x' in island[x]x的值是多少?
      • 如果同一行有两个 x 怎么办?此外,if 'x' in island 正在做所有寻找“x”的工作,然后丢弃它的位置信息。这是所需工作量的两倍。
      • 嗬,我在 shell 中乱搞,我忘记了我使用了随机变量....而且我在第一行中做了什么:\
      猜你喜欢
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-23
      • 2022-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多