根据部分字符串在Python中返回数组的索引位置
假设你有一个数组 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,10
、8,10
、7,9
、2,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
是空的原因。