如何在字符串中获取两个或多个重复字符的索引?

时间:2017-11-25 13:35:21

标签: python python-3.x python-2.7

我想在列表中存储两个或多个重复字符的实际索引。为此我使用了index()但它返回了所有重复字符的相同索引。 针对这个问题的任何其他解决方案。

2 个答案:

答案 0 :(得分:3)

让我们的列表和我们想要的元素定义如下:

my_list = [1, 3, 2, 4, 3, 3, 5, 3]
desired_element = 3

然后你可以使用一个很好的内置Python,enumerate()

indexes = [index for index, element in enumerate(my_list) if element == desired_element]
print(indexes)

输出正如预期[1, 4, 5, 7]

或者,以更好的格式:

def indexes(my_list, desired_element):
    return [index for index, element in enumerate(my_list) if element == desired_element]

然后使用indexes(list, element)调用它。

如果你正在寻找效率(我怀疑你是):

def indexes2(my_list, desired_element):
    for index, element in enumerate(my_list):
        if element == desired_element:
            yield index

对于大型列表(据我测试过),速度提高了4-5倍。请注意,这会返回一个生成器,为了显示结果,您必须使用list(...)将其转换为列表。

答案 1 :(得分:0)

使用pandas我们可以将它读到pd系列并一次完成一些操作。

import pandas as pd

l = ['a','b','c','a','b']

d = (pd.Series(l)[pd.Series(l).duplicated(keep=False)]
     .reset_index()
     .groupby(0)['index']
     .apply(list)
     .to_dict())

d

返回:

{'a': [0, 3], 'b': [1, 4]}

或者这个:

d = (pd.Series(l)
     .reset_index()
     .groupby(0)['index']
     .apply(lambda x: list(x) if len(list(x)) > 1 else None)
     .dropna()
     .to_dict())