【问题标题】:Accessing the index of a tuple nested inside a dictionary [closed]访问嵌套在字典中的元组的索引[关闭]
【发布时间】:2017-08-01 06:32:32
【问题描述】:

我正在尝试基于文本的国际象棋游戏,目前正在开发一个可以用来计算棋盘位置的系统。这是我目前正在采用的方法的 sn-p:

_file = ('A','B','C','D','E','F','G','H')

A1 = {'File' : _file[0], 'Rank' : _rank[0],
'Color' : color['Dark'], 'Piece' : pieces['None']},

字典 A1 描述了棋盘上的一个正方形,并具有文件的参数和正方形的等级、颜色以及上面的棋子。当前所有值都引用类似于 _file 的元组。这些作品使用相同的系统来描述它们的位置和内容。

我希望能够编写一些代码来更改字典中值的元组索引,使其看起来像这样:

 A1 = {'File' : _file[1], 'Rank' : _rank[0],
'Color' : color['Dark'], 'Piece' : pieces['None']},

但是到目前为止,我尝试的所有操作都在 _file[0] 引用的字符串“A”的索引上运行。例如,

print (A1['File'][1])

给我们一个索引超出范围的错误,因为我们真的告诉它:

print (_file[0][1]) # which means this:
print 'A'[1] 

当然,单字母字符串在 [1] 处没有索引。

为了简单起见,我最终可能会放弃这种方法并使用整数而不是元组,但如果我能做到这一点,它会更容易阅读(我认为。)有什么方法可以操作嵌套元组的索引?

【问题讨论】:

  • 为什么A1 = {'File' : _file[0], 'Rank' : _rank[0], 'Color' : color['Dark'], 'Piece' : pieces['None']} 有'File' : _file[0] 而不是'File' : _file
  • 因为它的文件应该是A,在_file[0]
  • 是的,但是你没有嵌套元组。
  • 您没有嵌套在字典中的元组。通过索引访问元组元素会得到元素,而不是元组。它不会以某种方式保留索引,这是没有意义的。
  • 我不关注。元组 _file 嵌套在字典 A1 中。

标签: python dictionary indexing nested tuples


【解决方案1】:

如果你想改变字典中File的值,你需要用新的索引重新赋值,例如:

_file = ('A','B','C','D','E','F','G','H')
A1 = {'File' : _file[0], 'Rank' : _rank[0],
'Color' : color['Dark'], 'Piece' : pieces['None']},
# _file[0] will be replaced with 'A' in the above dicitonary

A1['File'] = _file[1]

# now it will be 'B' instead

【讨论】:

  • 这可以更改附加到“文件”的值,但从长远来看,我需要一些方法来检查、添加和减去该索引。例如,如果我有一辆汽车在 A1 上并且想将它向右移动三个方格,我需要将 3 添加到它的 _file 索引中。或者,如果我想将一块棋子移动到任意方格,我需要检查目标方格的等级和文件,以确保首先没有友方棋子。如果没有简单的方法来获取该索引,我可能需要放弃它并尝试不同的方法。
  • 如果是这种情况,您可以只存储索引。点赞A1 = {'File': 0} 然后打印位置:print _file[A1['File']]
  • @John 您没有存储索引,因此没有要检查或更改的索引。
  • 玩了一会儿,我认为这将是最好的路线。谢谢
【解决方案2】:

字典包含对 _file 对象中的插槽的引用。 当您调用A1['File'] 时,它实际上指向_file[0] 对象。你得到了这个对象,而不是你期望的元组。

您可以更新字典中元组的索引值: A1['File'] = _file[1] 然后当你调用A1['File'] 你会得到_file[1]。您需要将元组的索引保留为 A dict 的一部分,并且每当更新索引时,您也会更新元组索引。

_file = ('A','B','C','D','E','F','G','H')
A1 = {'File' : _file[0], 'idx': 0}

def move_up(d):
    d['idx'] += 1
    d['File'] = _file[d['idx']]

输出

>>> A1
{'idx': 0, 'File': 'A'}
>>> move_up(A1)
>>> A1
{'idx': 1, 'File': 'B'}

【讨论】:

  • 这可能行得通!我会玩弄它,然后让你知道它是怎么回事。
  • 您可以将move_up 的前3 行压缩成一个d ['idx'] += 1 语句...
  • @brunodesthuilliers 我编辑了答案,这看起来更优雅。谢谢
猜你喜欢
  • 1970-01-01
  • 2017-01-21
  • 1970-01-01
  • 1970-01-01
  • 2021-11-09
  • 1970-01-01
  • 2021-05-30
  • 1970-01-01
  • 2023-01-25
相关资源
最近更新 更多