【问题标题】:Best way to initialize key/value pairs in dictionaries在字典中初始化键/值对的最佳方法
【发布时间】:2017-05-03 12:03:35
【问题描述】:

我正在使用 Python 3

我有一块板子,里面有我必须存储的单元格,每个单元格都有一个坐标,需要存储 3 个值。我使用了一个字典,其中键等于单元格的坐标,值是存储所需值的 3 个元素的列表。 当板子变大并且存储了很多键/值对时,获取和读取这些值会很快吗? 或者在速度方面还有什么其他方法更有效?

亚历克斯

编辑:

每个单元格需要的 3 个值是零或一。我有一个包含棋盘尺寸的元组,一个包含所有应具有值 1 作为第一个值的单元格位置的元组,一个包含所有应具有值 1 作为第二个值的单元格位置的frozenset值和一个元组,该元组包含所有应具有值 1 作为第三个值的单元格位置:

tuple1 是一个包含元组的元组,每个元组代表第一个值为 1 的单元格的位置,frozenset 包含的元组每个代表第二个值为 1 的单元格的位置,tuple2 包含的元组每个代表第三个值为 1 的单元格的位置(在列表中)

代码:

board = {}

for row in range(dimension[0]):
    for col in range(dimension[1]):
        board[(row,col)] = [0,0,0] #default
for x in tuple1:
    board[x][0] = 1

for x in frozenset:
    board[x][1] = 1

for x in tuple2:
    board[x][2] = 1

return board

现在查找键和值会很快吗?

EDIT2:这是建立这样一个字典的最快方法吗?

【问题讨论】:

  • 显示代码(一个小例子)
  • 你的意思是你会做类似board[(x,y,z)] = [a,b,c]的事情吗?
  • 我用代码编辑了帖子,我确实在做这样的事情!
  • 这取决于应用程序的范围和用途,例如,如果它变得很大,您将希望使用数据库研究持久存储。对于小型应用程序,您的方法可能没问题,但就像我说的 - 这取决于。
  • 比较小,dict里面最多有2400个key/value对

标签: python list dictionary


【解决方案1】:

numpy

如果您正在寻找性能,我认为您应该认真考虑带有布尔值的numpy。将元组作为值的 2-D Board 可以视为 3D 矩阵:

import numpy as np

width, height = 5, 5

board = np.full((width,height,3), False, dtype = bool)
tuple1 = ((1,2), (3,4), (0,2))

for i,j in tuple1:
    board[i,j,0] = True

print(board)
#   [[[False False False]
#     [False False False]
#     [ True False False]
#     [False False False]
#     [False False False]]

#    [[False False False]
#     [False False False]
#     [ True False False]
#     [False False False]
#     [False False False]]

#    [[False False False]
#     [False False False]
#     [False False False]
#     [False False False]
#     [False False False]]

#    [[False False False]
#     [False False False]
#     [False False False]
#     [False False False]
#     [ True False False]]

#    [[False False False]
#     [False False False]
#     [False False False]
#     [False False False]
#     [False False False]]]

使用标准列表

如果你不能使用numpy,你可以简单地使用标准列表:

width, height = 5, 5

board = [[[0, 0, 0] for j in range(width)] for i in range(height)]
tuple1 = ((1,2), (3,4), (0,2))

for i,j in tuple1:
    board[i][j][0] = 1

from pprint import pprint
pprint(board)  
[[[0, 0, 0], [0, 0, 0], [1, 0, 0], [0, 0, 0], [0, 0, 0]],
 [[0, 0, 0], [0, 0, 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], [1, 0, 0]],
 [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]]

我认为使用 dict 没有任何优势。它只会打乱你的单元格并使显示更难。

【讨论】:

  • 在我的情况下使用外部模块是不行的,我只能使用 Python 的内置模块
  • @AlexanderAmeye:太糟糕了,numpy 看起来很合适。请注意,它通常包含在 Python 标准发行版中。
  • @AlexanderAmeye:更新了列表示例。它应该比使用字典更容易
  • 所以使用列表不会减慢整个过程?我认为使用 dicts 的优点是查找键和获取它们的值的速度?
  • 因为我需要经常编辑这些列表的值,而且我希望这能很快发生 :)
猜你喜欢
  • 1970-01-01
  • 2015-07-16
  • 2018-03-09
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
  • 2010-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多