在Python中创建存储字符串最右边索引的矩阵

在Python中创建存储字符串最右边索引的矩阵,python,Python,我试图创建一个矩阵,它存储字符串最右边的索引。例如,如果我有字符串: "baby" 我想生成这样一个矩阵: [['b',2],['a',1],['y',3]] 其中,索引0表示字符串中的非重复字符,索引1表示字符串中该字符最右边的索引位置。例如,第一个字符“b”出现在索引0处,但另一个字符出现在索引2处,因此它将是2 我试过这样的方法: def str_matrix(string): matrix = [[]] for i in range(len(pattern)):

我试图创建一个矩阵,它存储字符串最右边的索引。例如,如果我有字符串:

"baby"
我想生成这样一个矩阵:

[['b',2],['a',1],['y',3]]
其中,索引0表示字符串中的非重复字符,索引1表示字符串中该字符最右边的索引位置。例如,第一个字符“b”出现在索引0处,但另一个字符出现在索引2处,因此它将是2

我试过这样的方法:

def str_matrix(string):
    matrix = [[]]
    for i in range(len(pattern)):
        if pattern[i] not in matrix:
            matrix.append([pattern[i],i])
        else:
            matrix[i][1].append(i)

    print(matrix)
但我得到了:

[[], ['b', 0], ['a', 1], ['b', 2], ['y', 3]]

如果您能在这方面提供帮助,将不胜感激。

您可以使用
OrderedICT
进行重复数据消除:

>>> from collections import OrderedDict
>>> s = "baby"
>>> OrderedDict((k, v) for v, k in enumerate(s))
OrderedDict([('b', 2), ('a', 1), ('y', 3)])
>>> [[k,v] for k, v in OrderedDict((k, v) for v, k in enumerate(s)).items()]
[['b', 2], ['a', 1], ['y', 3]]

您可以使用
OrderedDict
进行重复数据消除:

>>> from collections import OrderedDict
>>> s = "baby"
>>> OrderedDict((k, v) for v, k in enumerate(s))
OrderedDict([('b', 2), ('a', 1), ('y', 3)])
>>> [[k,v] for k, v in OrderedDict((k, v) for v, k in enumerate(s)).items()]
[['b', 2], ['a', 1], ['y', 3]]
也许:

也许:


由于@Maxxx表示顺序无关紧要(但原始答案是有序的),并且Maxxx更喜欢显式/可读形式(不是一行),因此我将在这里提供一个:

def str_matrix(string):
matrix = []
chars = set(string)  # only unique letters from the string
for char in chars:
    right_most_index = string.rfind(char)
    matrix.append([char, right_most_index])

编辑:我建议不要使用字符串作为名称,因为字符串是python默认库之一的名称。此外,为了获得更好的性能,请使用元组而不是列表(如我在对答案的初始评论中提供的一行代码;)

因为@Maxxx表示顺序无关紧要(但原始答案是有序的),并且Maxxx更喜欢显式/可读形式(不是一行代码),我将在这里提供一个:

def str_matrix(string):
matrix = []
chars = set(string)  # only unique letters from the string
for char in chars:
    right_most_index = string.rfind(char)
    matrix.append([char, right_most_index])

编辑:我建议不要使用字符串作为名称,因为字符串是python默认库之一的名称。此外,为了获得更好的性能,请使用元组而不是列表(如我在对答案的初始评论中提供的一行代码;)

您关心顺序吗?@DeepSpace否顺序无关紧要请参阅我的答案then@DeepSpace糟糕的是,我把自己和字母顺序搞混了。在本例中,我希望它是b,后跟a和y,类似于原始字符串的相对顺序。
[(char,string.rfind(char))for char In set(string)]
Edit:this works,但是不遵守字母顺序-我想这没关系。你在乎顺序吗?@DeepSpace不,顺序不重要请看我的回答then@DeepSpace糟糕的是,我把自己和字母顺序搞混了。在本例中,我希望它是b,后跟a和y,类似于原始字符串的相对顺序。
[(char,string.rfind(char))for char In set(string)]
Edit:这很有效,但不保持字母顺序-我想这没关系。