如何让这个匹配列表代码更有效率?
How do I make this matching list code more efficient?
我有两个列表。我想获得匹配的索引。我想出了以下例子来说明:
a = [1,2,6,5,3,4]
b = [1,3,4,2,5,6]
for i in range(len(a)):
for j in range(len(b)):
if b[j] != a[i]:
next
else:
print(i, j)
看起来很简单,但有点长。谁能帮我提高这段代码的效率?
输出:
0 0
1 3
2 5
3 4
4 1
5 2
您可以像这样使用列表理解:
>>> a = [1,2,6,5,3,4]
>>> b = [1,3,4,2,5,6]
>>>
>>> [[i,j] for i,k in enumerate(a) for j,v in enumerate(b) if k==v]
[[0, 0], [1, 3], [2, 5], [3, 4], [4, 1], [5, 2]]
a = [1,2,6,5,3,4]
b = [1,3,4,2,5,6,1,2,3,4,5,6]
b_dict = {}
for i, n in enumerate(b):
if n not in b_dict:
b_dict[n] = []
b_dict[n].append(i)
for i in range(len(a)):
if a[i] in b_dict:
for index in b_dict[a[i]]:
print(i, index)
O(a+b) 解,因为字典中的 "in" 是 O(1)
更新版本允许匹配b中的重复数字
提示
- 如果您有一个使用索引及其各自值的循环,请使用
enumerate
而不是 range(len())
和索引。
- 在这种情况下,您无需为不匹配条件 (
if b[j] != a[i]
) 而烦恼。
>>> for i, v0 in enumerate(a):
... for j, v1 in enumerate(b):
... if v0 == v1:
... print(i, j)
...
0 0
1 3
2 5
3 4
4 1
5 2
作为列表理解:
>>> [(i, j) for i, v0 in enumerate(a) for j, v1 in enumerate(b) if v0 == v1]
[(0, 0), (1, 3), (2, 5), (3, 4), (4, 1), (5, 2)]
(我输出了元组,因为它们在这种情况下似乎更有意义。)
我有两个列表。我想获得匹配的索引。我想出了以下例子来说明:
a = [1,2,6,5,3,4]
b = [1,3,4,2,5,6]
for i in range(len(a)):
for j in range(len(b)):
if b[j] != a[i]:
next
else:
print(i, j)
看起来很简单,但有点长。谁能帮我提高这段代码的效率?
输出:
0 0
1 3
2 5
3 4
4 1
5 2
您可以像这样使用列表理解:
>>> a = [1,2,6,5,3,4]
>>> b = [1,3,4,2,5,6]
>>>
>>> [[i,j] for i,k in enumerate(a) for j,v in enumerate(b) if k==v]
[[0, 0], [1, 3], [2, 5], [3, 4], [4, 1], [5, 2]]
a = [1,2,6,5,3,4]
b = [1,3,4,2,5,6,1,2,3,4,5,6]
b_dict = {}
for i, n in enumerate(b):
if n not in b_dict:
b_dict[n] = []
b_dict[n].append(i)
for i in range(len(a)):
if a[i] in b_dict:
for index in b_dict[a[i]]:
print(i, index)
O(a+b) 解,因为字典中的 "in" 是 O(1)
更新版本允许匹配b中的重复数字
提示
- 如果您有一个使用索引及其各自值的循环,请使用
enumerate
而不是range(len())
和索引。 - 在这种情况下,您无需为不匹配条件 (
if b[j] != a[i]
) 而烦恼。
>>> for i, v0 in enumerate(a):
... for j, v1 in enumerate(b):
... if v0 == v1:
... print(i, j)
...
0 0
1 3
2 5
3 4
4 1
5 2
作为列表理解:
>>> [(i, j) for i, v0 in enumerate(a) for j, v1 in enumerate(b) if v0 == v1]
[(0, 0), (1, 3), (2, 5), (3, 4), (4, 1), (5, 2)]
(我输出了元组,因为它们在这种情况下似乎更有意义。)