根据部分字符串在Python中返回数组的索引位置

0 投票
2 回答
1662 浏览
提问于 2025-04-18 03:37

假设你有一个数组 p

p=[['0', '9', '10', '13'], ['1', '8', '10', '14'], 
   ['2', '7', '9', '15'], ['3', '2', '8',  '18'], 
   ['4', '1', '7', '19'], ['5', '1', '2', '20'], 
   ['6', '2', '4', '21'], ['7', '1', '3',  '22'], 
   ['8', '4', '6', '25'], ['9', '3', '5', '26'], 
   ['10', '5', '6', '27'], ['11', '8', '10', '28'],
   ['12', '7', '9', '31'], ['13', '1', '2', '32'], 
   ['14', '4', '6', '33'], ['15', '3', '5', '34']]

我想知道一些元素的索引,这些元素的部分字符串应该总是和 p 中位置 [1][2] 的元素匹配(在 p 中,这些位置的元素可能是 9,108,107,92,8 等等)。举个例子,我想知道包含部分字符串 '1','2' 的元素的索引。在这种情况下,索引应该是:[5,13],对应的元素是:

    ['5', '1', '2', '20']
    ['13', '1', '2', '32']

我在 StackOverflow 上找到了一个相关的问题:python - 根据部分字符串查找列表中的索引位置。不过,当我只用 2 作为部分字符串时,得到了以下结果(这很完美):

    >>> indices = [i for i, s in enumerate(p) if '2' in s]
    >>> indices
     [2, 3, 5, 6, 13]
    >>> 

但是,当我尝试用 ('1','2') 时,我什么也没得到:

    >>> indices = [i for i, s in enumerate(p) if ('1','2') in s]
    >>> indices
     []

我应该如何在 if 语句中写这个部分字符串,以便代码能够正常工作呢?我真的不明白为什么它不工作。如果有人能帮我理解这一点,我会很高兴。我试过:把部分字符串放在 [] 中,或者在条件之前定义它为一个数组,但这些都不行。还有其他方法可以完成同样的任务吗?因为我知道,仅仅使用上面提到的链接中的代码并不能在位置 [1][2] 中查找匹配项。

2 个回答

0

你需要使用 itertool.combinations,就像这个例子一样:

import itertools

indices = [i for i, s in enumerate(p) if ('1', '2') in list(itertools.combinations(s, 2))]
print indices

输出结果将会是:

[5, 13]

要知道,如果你用 list 来处理 itertools 的话,如果你的列表很大,会占用很多内存。

希望这对你有帮助。

0

你需要像这样:

indices = [i for i, s in enumerate(p) if ('1','2') == (s[1],s[2])]

在你的列表推导式中,每个 s 是一个字符串数组,而 if 语句是在检查一个包含两个字符串的元组是否在这个列表中,这个检查总是返回假,也就是说找不到。

>>> '2' in ['5', '1', '2', '20']
True
>>> ('1', '2') in ['5', '1', '2', '20']
False
>>> ['1', '2'] in ['5', '1', '2', '20']
False

这就是为什么最后得到的 indices 是空的原因。

撰写回答