假设您有一个数组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 - 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]
中的匹配项。
答案 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
会占用大量内存。
希望这会有所帮助。