基于Python中的部分字符串返回数组中的索引位置

时间:2014-04-21 16:28:19

标签: python arrays string indexing partial

假设您有一个数组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 - find index postion in list based of partial string。但是,当我尝试仅使用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 :(得分:0)

你需要这样的东西:

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

在列表推导中,每个s都是一个字符串数组,if语句正在检查该列表中是否包含两个字符串的元组,它总是计算为false。

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

这就是生成的indices为空的原因。

答案 1 :(得分: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]

知道如果你有大量列表,在itertools上使用list会占用大量内存。

希望这会有所帮助。