簡體   English   中英

如何使此匹配列表代碼更有效?

[英]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,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 中的重復數字

您可以像這樣使用列表理解:

>>> 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]]

提示

  1. 如果您有一個使用索引及其各自值的循環,請使用enumerate而不是range(len())和索引。
  2. 在這種情況下,您無需擔心不匹配的條件( 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)]

(我輸出元組是因為它們在這種情況下似乎更有意義。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM