[英]How to efficiently compare the items in a list within a dictionary to the 0th item within another list within a second dictionary
我有兩個字典。 一本字典具有值列表,如下所示:
d1 = {10: [123, 244, 222], 13: [109, 125]}
在這本詞典中,列表中大部分只包含一項,但有些包含多個值。
第二個字典也有一個值列表。 但是對於此列表中的每個值,都有多個值。 因此,基本上我的第二本詞典包含一個列表列表,如下所示:
d2 = {125: [[120, 244, 222], [177, 134, 111], [123, 11, 344]], 123: [[125, 109, 180], [123, 156, 290]]}
我想做的就是針對d2
所有鍵中的每個列表,有效地比較d1
中的所有值和位置0中的所有值。
例如,我想將d1
每個單個值與d2: (120, 177, 123, 125, 123)
的以下值進行比較d2: (120, 177, 123, 125, 123)
因為這些值代表所有列表中的第0個值。 然后,我想將其第0個值與d1
值匹配的列表存儲。
由於某種原因,索引對我不起作用。 我一直在嘗試:
for key, value in d1.iteritems():
for list in value:
for key, value2 in d2.iteritems():
for item2 in value2:
if list == item2[0]:
d3[item2[0]].append(item2[0:])
並獲得以下輸出:
defaultdict(<type 'list'>, {125: [[125, 109, 180]], 123: [[123, 11, 344], [123, 156, 290]]})
但是在此示例中使用的字典比我的實際字典小得多。 一個擁有數十萬行數據,另一個擁有數百萬行。
我沒有納入我的代碼中的一件事是僅在鍵具有匹配的鍵時才對鍵進行迭代。
我開始的時候是這樣的:
for key in d1.iterkeys() and d2.iterkeys():
但是遇到以下問題:
if d1[key][:] == d2[key][:][:][0]
由於存在列表列表的整個問題。 這部分非常令人沮喪。 如果我可以迭代而不必顯式使用我的代碼的這一部分(用於值列表),只需執行一個值索引,就可以節省時間。 但是索引對我沒有用。 例如,使用d2[key][:][:][0]
,我總是(對於我的第二本字典)總是得到鍵中的第一個列表,而不是鍵中每個列表的第一個值。
編輯:直到我得到下面的兩個答案的更新,我在這里工作此代碼,這與我的初始代碼基本相同,除了我添加了一個條件語句,在該語句中檢查鍵是否相等。 在條件查詢中添加條件語句以加快搜索速度是否有意義? 我不知道添加if語句是否會比僅搜索鍵匹配的地方放慢速度更快。
for key1, value1 in d1.iteritems():
for item1 in value1:
for key2, value2 in d2.iteritems():
if key1 == key2:
for item2 in value2:
if list == item2[0]:
d3.append(item2)
最明確的方法是:
d1 = {10: [123, 244, 222], 13: [109, 125]}
d2 = {125: [[120, 244, 222], [177, 134, 111], [123, 11, 344]], 123: [[125, 109, 180], [123, 156, 290]]}
for key1 in d1:
for val1 in d1[key1]:
for key2 in d2:
for vals2 in d2[key2]:
val2 = vals2[0]
if val1 == val2:
print "equal"
當然,不僅需要打印它們相等,還可以對key1
, key2
, val1
和val2
。
假設d2的值都是list的列表
d1 = {10: [123, 244, 222], 13: [109, 125]}
d2 = {125: [[120, 244, 222], [177, 134, 111], [123, 11, 344]], 123: [[125, 109, 180], [123, 156, 290]]}
d1Flat = [i for item in d1.values() for i in item]
d2Flat = [i for item in d2.values() for i in item]
res = []
for lst in d2Flat:
if lst[0] in d1Flat:
res.append(lst)
這是我的努力:
from itertools import chain
d1 = {10: [123, 244, 222], 13: [109, 125]}
d2 = {125: [[120, 244, 222], [177, 134, 111], [123, 11, 344]], 123: [[125, 109, 180], [123, 156, 290]]}
# Flatten out the list using a list comprehension
key_values = [values for list in d1.values() for values in list]
new_dict = dict()
for d2_list in chain.from_iterable(d2.itervalues()):
key_to_check = d2_list[0]
if key_to_check in key_values:
if key_to_check in new_dict:
new_dict[key_to_check].append(d2_list)
else:
new_dict[key_to_check] = [d2_list]
print new_dict
由於我們僅使用迭代器遍歷第二個字典的值,因此這至少應該更快一些。 我使用chain.from_iterable使itervalues調用中的迭代器列表平坦化。
現在,對於實際搜索,我只需要檢查當前的“鍵”(索引為0的元素)是否在我們從d1展平的值列表中。 在大型數據集中進行嘗試,看看它是否比當前解決方案快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.