这就是我的意思。
给出一个清单
l = [1,2,3,4,5,6]
我想覆盖列表的 getitem ,以便l['a']
返回与返回l['A']
的{{1}}相同的内容。
这听起来像一个奇怪的想法,但这就是为什么这对我来说非常有用。我正在制作国际象棋游戏,棋盘存储为2D列表。根据国际象棋惯例,排名是整数 [1-8] ,文件是字母 [a-h] 。排名索引已经是一个整数,我只需要从中减去一个。但是,对于文件,支持索引会很好。
我怎样才能做到这一点?为了完整起见,这是董事会成员的一部分:
l[0]
提前致谢!
答案 0 :(得分:2)
在我看来,你需要的是一个字典,而不是一个列表。像这样的字典可以解决你的问题
l = {}
l['a'] = [1, 2, 3, 4, 5, 6, 7, 8]
l['b'] = [1, 2, 3, 4, 5, 6, 7, 8]
这样您就可以访问l['a'][1]
或l['b'][6]
等元素。
答案 1 :(得分:1)
您可以使用以下内容:
l = [1, 2, 3, 4, 5, 6]
d = {}
for i, v in enumerate(l):
d[chr(i + 65)] = v # Use 'A', ... as key.
d[chr(i + 97)] = v # Use 'a', ... as key.
然后,您可以使用l
和d['A']
访问d['a']
(或其副本)的值。
请注意,如果列表中的值超过158,则分配将失败,因为chr
仅将整数0 <= x < 256
作为参数。
或者,如果您想与原始列表l
保持同步,可以使用包装类:
class AlphStore:
def __init__(self, original_list):
self._l = original_list
def __getitem__(self, v):
return self._l[ord(v.upper()) - 65]
你可以这样使用它:
>>> l = [1, 2, 3, 4, 5, 6]
>>> store = AlphStore(l)
>>> store['A']
1
>>> store['a'] is store['A']
True
答案 2 :(得分:1)
您可以使用类似下面的类来包装列表,该类实现了方括号的自定义使用,
class AlphabeticalList(object):
def __init__(self, data):
self.data = data
offset = ord("a")
def __getitem__(self, key):
return self.data[ord(key) - self.offset]
def __setitem(self, key, value):
self.data[ord(key) - self.offset] = value
test_list = AlphabeticalList([1, 2, 3, 4, 5, 6, 7])
print(test_list["a"])
如果您需要为容器实施进一步的自定义逻辑,这可能会有所帮助。
或者,您可以使用ordereddict
模块中的collections
,它为您提供列表等有序元素,但允许您按字符串索引。
答案 3 :(得分:1)
这是你想要的吗?
在__getitem__
执行此操作
def __getitem__(self, key):
import string
index = string.ascii_lowercase.find(key.lower())
return whatever_your_list_is_named[index]
编辑:忘了实际归还的东西......
答案 4 :(得分:0)
以下是我实施解决方案的方法:
# The following two magic methods allow us to do Board[i][j] instead of Board.board[i][j]
# This is a shortcut but should be used because it prevents us from deleting a piece.
# A piece should be replaced by a Blank instead.
def __getitem__(self, index):
if type(index) is int:
return self.board[index]
# else assume it is a str with the file then rank like 'e3'
f, r = index
x = [7, 6, 5, 4, 3, 2, 1, 0][int(r)-1]
y = ord(f) - ord('a')
return self.board[x][y]
这允许我同时执行board [x] [y]和board ['fr'],其中fr是文件和等级。感谢所有发布答案的其他用户,这有助于我制定这个答案。