我有一個可迭代的唯一數字:
lst = [14, 11, 8, 55]
其中每個值都在 dict 的可迭代值中的某個位置,比如串列:
dict_itms.items() = dict_items([(1, [0, 1, 2, 3]), (2, [11, 14, 12]), (3, [30, 8, 42]), (4, [55, 6])])
我必須以lst這樣的方式找到字典中的每個元素,最后,我將針對 lst 中的每個元素成對地列出一個鍵串列。
這種方法:
keys_ = []
for a in lst:
for k, v in dict_itms.items():
if a in v:
keys_ = [k]
break
else:
continue
給出:
[2, 2, 3, 4]
是否有更有效的方法來針對每個要查找的數字成對找到每個鍵?
uj5u.com熱心網友回復:
您可以any在串列理解中使用:
print([k for k,v in dict_itms.items() if any(x in lst for x in v)])
輸出:
[2, 3, 4]
更新
根據這個答案 not set(v).isdisjoint(lst)是最快的:
print([k for k,v in dict_itms.items() if not set(v).isdisjoint(lst)])
uj5u.com熱心網友回復:
一個簡單的 Pythonic 實作:
d = dict([(1, [0, 1, 2, 3]), (2, [11, 14, 12]), (3, [30, 8, 42]), (4, [55, 6])])
xs = [14, 11, 8, 55]
keys = [k for k, v in d.items() if set(v).intersection(xs)]
print(keys)
但是,這不會復制您的示例中的 2 鍵 - 不確定這是否是您需要的行為?
uj5u.com熱心網友回復:
不清楚你所說的“高效”是什么意思;你需要這在給定的傳球或總體上是有效的嗎?我問的原因是,通常處理此問題的最佳方法是進行預處理傳遞,以翻轉您的鍵值關系:
reverse_lookup = dict()
for k,v in d.items():
for i in v:
keys = reverse_lookup.get(i, []) # Provide an empty list if this item not yet found
keys.append(k)
reverse_lookup[i] = keys
現在您已經處理了反向查找,您可以直接使用它:
result = [reverse_lookup.get(i) for i in lst]
# `result` is actually a list of lists, so as to allow duplicates. You will need to flatten it, or change the reverse lookup to ignore dupes.
反向查找的初始處理是O(n*m),其中n*m是原始字典值的總長度之和。但是,該lst部分的每次查找都是O(1),因此如果您瞇著眼睛并進行了足夠多的查找,那么.的長度O(p)在哪里?如果你必須做很多事情,這將比其他方法更有效,如果你只傳遞給定的字典一次,效率就會低得多。plst
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/350561.html
