0

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

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

以及在子列表中多次出现的两个整数 a 和 b。我想要的是找到 L 中包含 a 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 or b (or is inclusive)”改为“a AND b”。我写了一个关于我的目标的错误。

4

4 回答 4

2

你可以这样做:

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

enumerate 将在列表理解中为您提供索引和值,并且 any 语句将告诉您 a 或 b 是否在 x 中,x 是 L 中的子列表

于 2013-10-22T19:51:04.503 回答
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
于 2013-10-22T19:48:48.910 回答
0

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

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

result = [a_tuple for a_tuple in L if a in a_tuple or b in a_tuple]
于 2013-10-22T19:52:34.013 回答
0

尝试

for index, item in enumerate(L):
  if a in item or b in item:
    r.append(index)
于 2013-10-22T19:57:08.957 回答