我有一个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”。我写了一个关于我的目标的错误。
答案 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)