【问题标题】:Return index position in array based on a partial string in Python基于Python中的部分字符串返回数组中的索引位置
【发布时间】:2014-06-05 18:06:59
【问题描述】:

假设你有一个数组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,@987654329 @、7,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] 位置搜索匹配项。

【问题讨论】:

    标签: python arrays string indexing partial


    【解决方案1】:

    你需要这样的东西:

    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 为空的原因。

    【讨论】:

    • 感谢@YS-L 这有效。也感谢您的解释。
    • @muammar 没问题。如果有帮助,您可以考虑通过接受答案来结束此问题。
    【解决方案2】:

    你需要像这个例子一样使用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]
    

    知道如果您的列表很大,使用 listover itertools 会占用大量内存。

    希望这会有所帮助。

    【讨论】:

    • 感谢您的回答。我不确定当列表变大时 itertools 会占用多少内存。所以我以@YS-L 提供的答案为答案。
    猜你喜欢
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多