如何在一个列表中找到前两个元素的索引,这些元素是另一个列表中的任意元素?

9

如何找到一个列表中第一、第二个与另一个列表中任意元素相同的元素的索引?

例如:

story = ['a', 'b', 'c', 'd', 'b', 'c', 'c']
elementsToCheck = ['a', 'c', 'f', 'h']

在这种情况下,期望的输出是字符串 'a' 和 'c' 的列表 indices = [0,2]

那么,为什么不选择 [0,2,5,6] 呢?这些也是 elementsToCheck 的前两个元素 ['a', 'c'] 的索引吗? - quamrana
@quamrana 啊,抱歉!我没有表达清楚。我的意思是说,我只想要在story中elementsToCheck中任何元素的前两个出现次数。这就是为什么只保存了两个索引:0和2,分别对应'a'和'c'。 - jo_
如果 story 的开头再加上一个 'a',那么结果应该是什么? - superb rain
1
@superb rain 在这种情况下,结果将是 indices = [0,1]。 - jo_
5个回答

7
story = ['a', 'b', 'c', 'd', 'b', 'c', 'c']
elementsToCheck = ['a', 'c', 'f', 'h']

out = []
for i, v in enumerate(story):
    if v in elementsToCheck:
        out.append(i)
    if len(out) == 2:
        break

print(out)

输出:

[0, 2]

3
可能实现这个的最短方法如下:
[i for i, x in enumerate(story) if x in elementsToCheck][:2]

1
紧凑而美观。但是,如果“story”是一个大数组,这种方法将效率低下。 - codeforester
是的,如果我们可以在列表推导式中有一个休息,那么紧凑和高效就可以共存了。 - Gil Pinsky

1
story = ['a', 'b', 'c', 'd', 'b', 'c', 'c']
elementsToCheck = ['a', 'c', 'f', 'h']
tmp=[]
for i in range(0,len(elementsToCheck)):
    if elementsToCheck[i] in story and i<2:
        tmp.append(story.index(elementsToCheck[i]))
print(tmp)

1
这是一个更符合Python风格的解决方案。我猜想每个你想要检查的元素都应该是唯一的,所以最好使用集合而不是列表。您可以查找每个要检查的元素的索引并返回其中最小的两个。
story = ['a', 'b', 'c', 'd', 'b', 'c', 'c']
elementsToCheck = {'a', 'c', 'f', 'h', 'd'}

idxs = {story.index(x) for x in elementsToCheck if x in story}

print(
    min(idxs), min(idxs-{min(idxs)})
)

1
这是一个稍微通用一些的方法。
def firstShared(story,elementsToCheck,n=2):
    overlap = set(i for i in elementsToCheck if i in story)
    firstn = sorted(overlap,key=elementsToCheck.index)[:n]
    indices = [story.index(i) for i in firstn]
    return(indices)
    
    
if __name__ == '__main__':
    n = 2
    story = ['a', 'b', 'c', 'd', 'b', 'c', 'c']
    elementsToCheck = ['a', 'c', 'f', 'h']
    # elementsToCheck = ['a', 'b', 'c', 'd', 'f', 'h']
    for i in range(4):
        print(firstShared(story,elementsToCheck,i))
    # []
    # [0]
    # [0, 2]
    # [0, 2]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接