基于两个标准从列表中检索项目的“最佳”pythonic方法

时间:2015-12-10 12:56:44

标签: python list

我有一个包含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坐标,我想检索值,最好是以节省时间的方式?

我意识到这可能不是列表中最好的组织(但这就是我的数据组织方式......)。

4 个答案:

答案 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]

(没有嵌套字典,没有第三级,只是像访问一样的矩阵)