【问题标题】:How to search a list for a pair of coordinates?如何在列表中搜索一对坐标?
【发布时间】:2017-10-05 21:51:53
【问题描述】:

我有一个包含一些文本数据和数值坐标的列表,如下:

coords = [['1a', 'sp1', '1', '9'],
          ['1b', 'sp1', '3', '11'],
          ['1c', 'sp1', '6', '12'],
          ['2a', 'sp2', '1', '9'],
          ['2b', 'sp2', '1', '10'],
          ['2c', 'sp2', '3', '10'],
          ['2d', 'sp2', '4', '11'],
          ['2e', 'sp2', '5', '12'],
          ['2f', 'sp2', '6', '12'],
          ['3a', 'sp3', '4', '13'],
          ['3b', 'sp3', '5', '11'],
          ['3c', 'sp3', '8', '8'],
          ['4a', 'sp4', '4', '12'],
          ['4b', 'sp4', '6', '11'],
          ['4c', 'sp4', '7', '8'],
          ['5a', 'sp5', '8', '8'],
          ['5b', 'sp5', '7', '6'],
          ['5c', 'sp5', '8', '2'],
          ['6a', 'sp6', '8', '8'],
          ['6b', 'sp6', '7', '5'],
          ['6c', 'sp6', '8', '3']]

给定一对坐标 (x,y),我想在列表(它本身就是一个列表)中找到与所述坐标对对应的元素。因此,例如,如果我有 x = 5 和 y = 12,我会得到['2e', 'sp2', '5', '12']

我试过了:

x = 5
y = 12
print coords[(coords == str(x)) & (coords == str(y))]

但得到一个空列表。

我也试过这个:

import numpy as np    
print np.where(coords == str(x)) and np.where(coords == str(y))

但无法理解它返回的((array([ 2, 7, 8, 12]), array([3, 3, 3, 3])))

谁能帮帮我?

【问题讨论】:

  • list 对象不像numpy.ndarray 对象那样工作
  • 这个我已经明白了。对可行的解决方案有何建议?
  • 遍历你的列表,检查是否sub[-2] == x and sub[-1] == y

标签: python list search


【解决方案1】:

利用列表理解。遍历所有坐标并查看 x 和 y 相等的位置。

coords = [['1a', 'sp1', '1', '9'], ['1b', 'sp1', '3', '11'], ['1c', 'sp1', '6', '12'], ['2a', 'sp2', '1', '9'], ['2b', 'sp2', '1', '10'], ['2c', 'sp2', '3', '10'], ['2d', 'sp2', '4', '11'], ['2e', 'sp2', '5', '12'], ['2f', 'sp2', '6', '12'], ['3a', 'sp3', '4', '13'], ['3b', 'sp3', '5', '11'], ['3c', 'sp3', '8', '8'], ['4a', 'sp4', '4', '12'], ['4b', 'sp4', '6', '11'], ['4c', 'sp4', '7', '8'], ['5a', 'sp5', '8', '8'], ['5b', 'sp5', '7', '6'], ['5c', 'sp5', '8', '2'], ['6a', 'sp6', '8', '8'], ['6b', 'sp6', '7', '5'], ['6c', 'sp6', '8', '3']]

x = 5
y = 12

answer = [cood for cood in coords if int(cood[2]) == x and int(cood[3]) == y]
print(answer)

【讨论】:

  • 就是这样! 非常感谢
【解决方案2】:

对于一般解决方案,您可以使用字典理解,

x, y = 5, 12
print({tuple(coord[-2:]):coord for coord in coords}[str(x),str(y)])

【讨论】:

  • 请注意,如果列表中有多个匹配项,这将只返回最后一个。
【解决方案3】:

如果您正在寻找简单的 Python 解决方案,请尝试使用此

[coord for coord in coords if coord[2] == str(x) and coord[3] == str(y) ]

这确实会让你回来[['2e', 'sp2', '5', '12']]

我不确定您要在解决方案 print coords[(coords == str(x)) & (coords == str(y))] 中完成什么。您需要遍历列表以查找哪些元素与您的 (x, y) 坐标匹配。

【讨论】:

  • 也是一个简单直接的解决方案。您在我的问题中指出的程序语句 (print coords[(coords == str(x)) & (coords == str(y))]) 显然是错误的(这就是它返回给我一个空列表的原因)。
【解决方案4】:

你可以使用这个非 numpy 列表理解:

>>> [[a,b,c,d] for (a,b,c,d) in coords if int(c) == x and int(d) == y]
[['2e', 'sp2', '5', '12']]

使用numpy,您应该只将第三列和第四列与xy 进行比较,而不是整行,然后获取这些索引。

>>> arr = np.array(coords)
>>> arr[(arr[:,2] == str(x)) & (arr[:,3] == str(y))]
array([['2e', 'sp2', '5', '12']], dtype='|S3')

【讨论】:

  • 非numpy解决方案也不错,但它只返回第一个列表元素(并且可能有重复)。
  • @maurobio 为什么只返回第一个?如果有多个元素与模式匹配,它将全部返回。
  • 当然,我很抱歉。在运行您的代码之前,我仅根据您提供的示例编写了我的评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-19
  • 1970-01-01
  • 2019-07-04
  • 2012-12-19
  • 1970-01-01
相关资源
最近更新 更多