我有一个包含r行和三列的列表。第一列是x坐标,第二列是y坐标,第三列是它的值。
Looks like e.g.
x y value
------------
0, 0, value
0, 1, value
0, 2, value
...
1, 0, value
1, 1, value
...
100, 0, value
100, 1, value
...
根据x和y坐标,我想检索值,最好是以节省时间的方式?
我意识到这可能不是列表中最好的组织(但这就是我的数据组织方式......)。
答案 0 :(得分:6)
取决于如果你想使用其他查询,你可以选择不同的数据结构! 如果您想要更灵活的查询,可以使用这样的多维列表:
my_list = [[1,2,3],[4,5,6]]
所以my_list[0][2]
为3,my_list[1][1]
为5
但如果您确定始终使用 x,y 来获取值,我认为词典是更好的选择
所以你的数据结构如下:
my_dict = {
(1, 1): 'value #1',
(1, 3): 'value #2',
(3, 4): 'value #3',
...
}
你会检索这样的数据:
my_dict[(1, 1)] or my_dict[(3, 4)]
答案 1 :(得分:1)
如果永远不会有重复的坐标,我会使用列表列表。是否按X轴或Y轴组织它取决于您。
例如:
lookup_table[4][5] = "the value of x4, y5"
答案 2 :(得分:1)
简单的二维列表将适合您。
x y值
0,0,值
0,1,值
0,2,值
assuming max x, max y = size_of_x_coordinate, size_of_y_coordinate = 10, 10
coordinates = [ [0]* size_of_y_coordinate ] * size_of_x_coordinate
# get value at x = 9, y = 8 just do
coordinates[x][y]
答案 3 :(得分:1)
让我们说你的清单是这样组织的
l = [(0, 0, 1), (0, 2, 5), (1, 3, 2), (0, 0, 3)]
然后我们可以定义一个搜索数据的函数
def in_l(l,x,y):
return [el[2] for el in l if(el[0]==x and el[1]==y)]
并使用它
print in_l(l, 0, 0) # -> [1, 3]
print in_l(l, 5, 1) # -> []
print in_l(l, 1, 3) # -> [2]
如果您确定数据中没有重复的数据点, 你可以将你的功能定义为
def in_l(l, x, y):
for _ in l:
if _[0]==x and _[1]==y : return _[2]
在第一场比赛中返回,如果找不到匹配则返回None
print in_l(l, 0, 0) # -> 1
print in_l(l, 5, 1) # -> None
print in_l(l, 1, 3) # -> 2
P.S。正如其他人告诉你的那样,你的数据结构(?)是不合适的
您可以使用的可能数据结构,从您的评论到另一个答案,是一个字典
grid = {}
for line in open('data.csv'):
x, y, val = map(int, line.split(',')):
grid[x,y] = val
以下您可以按如下方式使用您的数据
x1, y1 = a_model_of_everything(42)
val1 = grid[x1,y1]
(没有嵌套字典,没有第三级,只是像访问一样的矩阵)