Python - 搜索包含一个元素的列表中的列表索引

时间:2013-10-22 19:43:53

标签: python list

我有一个4长列表的列表L

L = [[1,2,12,13],[2,3,13,14],...]

和两个在子列表中出现多次的整数a和b。我想要的是找到L中包含AND b的子列表的索引。

我写了一些代码

l=[]
for i in range(len(L)):
    if L[i][0]==a or L[i][1]==a or L[i][2]==a or L[i][3]==a:
        l.append([i] + L[i]) # I put the index in the first position.
# Now l is a list of 5-length lists.
# I do the same loop on that list.
r=[]
for i in range(len(l)):
    if l[i][1]==b or l[i][2]==b or l[i][3]==b or l[i][4]==b:
        r.append(i)

我要找的索引在列表r中。但是我很确定在Python中有另一种方法可以做到这一点,因为我几乎不懂这种语言。也许如果我的变量L不是列表列表,那么它会更容易/更快,因为我会在我的主程序中调用这个过程。 (len(L)约为3000)

顺便说一下,我知道索引的数量介于1到4之间,所以我可以稍微休息,但我不知道它是否会更快。

----------------编辑1 ----------------

在第二句中将“a或b(或包含)”更改为“a AND b”。我写了一个关于我的目标的错误。

4 个答案:

答案 0 :(得分:2)

你可以这样做:

r = [i for i,x in enumerate(L) if any(y in x for y in (a,b))]

枚举将在列表推导中为您提供索引和值,any语句将告诉您a或b是否在x中,这是L中的子列表

答案 1 :(得分:0)

使用any()测试子列表:

if any(a in subl for subl in L):

这将测试每个subl,但如果找到匹配项,则会提前退出生成器表达式循环。

会返回匹配的特定子列表。您可以将next()与生成器表达式一起使用来查找第一个匹配项:

matched = next((subl for subl in L if a in subl), None)
if matched is not None:
    matched[1] += 1

如果生成器表达式引发None异常,则StopIteration是默认值,或者您可以省略默认值并使用异常处理:

try:
    matched = next(subl for subl in L if a in subl)
    matched[1] += 1
except StopIteration:
    pass # no match found

答案 2 :(得分:0)

这种事情是列表理解的目的。

如果您真的想要包容性或 - 那么这就是您想要的列表。在您的代码中,您目前正在给予和。

result = [a_tuple for a_tuple in L if a in a_tuple or b in a_tuple]

答案 3 :(得分:0)

尝试

for index, item in enumerate(L):
  if a in item or b in item:
    r.append(index)