如何使python列表按字母顺序排列?

时间:2017-06-19 16:19:41

标签: python list indexing

这就是我的意思。

给出一个清单

l = [1,2,3,4,5,6]

我想覆盖列表的 getitem ,以便l['a']返回与返回l['A']的{​​{1}}相同的内容。

这听起来像一个奇怪的想法,但这就是为什么这对我来说非常有用。我正在制作国际象棋游戏,棋盘存储为2D列表。根据国际象棋惯例,排名是整数 [1-8] ,文件是字母 [a-h] 。排名索引已经是一个整数,我只需要从中减去一个。但是,对于文件,支持索引会很好。

我怎样才能做到这一点?为了完整起见,这是董事会成员的一部分:

l[0]

提前致谢!

5 个答案:

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

然后,您可以使用ld['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是文件和等级。感谢所有发布答案的其他用户,这有助于我制定这个答案。