簡體   English   中英

匹配兩個列表字段 python 的最快方法

[英]Fastest way to match two list fields python

我在最新的 python 腳本中遇到了時間問題。 本質上,我有兩個列表,例如 List1: ([a,1],[b,2]) List2: ([a,3],[b,4])

現在在上面的示例中,我在每個列表中提供了兩個條目。 然而,實際上大約有 150,000 個。

在我當前的腳本中,我從第一個列表[a]中檢索第一個字段並遍歷整個 List2 直到匹配。 然后附加兩個列表條目。

最終結果將是: ([a,1,3],[b,2,4])

但是,鑒於列表的大小,這將永遠持續下去。

有沒有辦法我可以使用 list1 [a]的字段並在恆定時間內檢索 list2 中具有[a]所有條目

我在網上看到了一些建議集的答案,但我不確定如何實現一個並使用它來解決上述解決方案。

任何幫助,將不勝感激。

進一步的例子:

l1=(['abc123','hi'], ['efg456','bye']) - l1 有大約 2000 個元組

l2=(['abc123','letter'],['abc123','john'],['abc123','leaf']) - l2 有大約 100,000+ 個元組

Output: l3=(['abc123','hi','letter'],['abc123','hi','john'],['abc123','hi','leaf'])

如果您ab值是唯一的,您可以將“列表”(您擁有的實際上是列表元組,而不是列表列表)轉換為字典,然后將它們合並。 例如:

l1 = (['a', 1], ['b', 2], ['c', 5])
l2 = (['a', 3], ['b', 4])

d1 = { k : [v] for [k, v] in l1 }
d2 = { k : [v] for [k, v] in l2 }

for k in d1.keys():
    d1[k] += d2.get(k, [])
    
print(d1)

Output:

{'a': [1, 3], 'b': [2, 4], 'c': [5]}

您可以使用推導將該字典轉換回列表元組:

print(tuple([k, *v] for k, v in d1.items()))

Output:

(['a', 1, 3], ['b', 2, 4], ['c', 5])

沒那么難,只需對 list1 使用一個 dict,對 list2 使用一個 for 循環。

dict1 = {key1: [value1] for key1, value1 in list1}  # convert list1 to dict
                                                    # and the values should be converted to dict
for key2, value2 in list2:
    try:
        dict1[key2].append(value2)
    except KeyError:
        continue  # I'm not sure what do you want to do if the keys in list2 didn't exist in list1, so just ignore them
list3 = tuple([key3, *value3] for key3, value3 in dict1.items())
print(list3)

暫無
暫無

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

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