2016-03-28 118 views
1

我有像這樣的詞典列表:匹配詞典列表的最有效方法是什麼?

lst = [{'City or Community': 'Augusta', 'State':'GA', 'Parent Company': 'WoW!'}, 
     {'City or Community': 'Augusta', 'State':'GA', 'Parent Company': 'Comcast'}] 

什麼是通過列表迭代找到一個地方城市/州有超過1分的結果情況下,最有效的方法是什麼?

這就是我現在所做的:

def search(complete): 
    #searching through the full list for footprints which overlap by city, county, state, etc 
    trial = [] 
    for y in complete: 
     for x in complete: 
      for subdicts in y: 
       for otherdicts in x: 
        if otherdicts['Parent Company'] != subdicts['Parent Company'] and (otherdicts['City or Community'], otherdicts['State']) == (subdicts['City or Community'], subdicts['State']): 

回答

0

下面是與defaultdict的方法:

from collections import defaultdict 

combined = defaultdict(list) 
lst = [{'City or Community': 'Augusta', 'State':'GA', 'Parent Company': 'WoW!'}, 
     {'City or Community': 'Augusta', 'State':'GA', 'Parent Company': 'Comcast'},] 

# Loop through your list of dictionaries and 
# create a combined dictionary where keys are cities and states, and values are lists of companies 
for d in lst: 
    combined[(d['City or Community'], d['State'])].append(d['Parent Company']) 

# For each of the keys in the combined dictionary, only print them out 
# if there are more than one companies for that key 
print(list(cityAndState for (cityAndState, companies) in combined.items() if len(companies) > 1)) 
>>> [('Augusta', 'GA')] 
0
[x for x, y in itertools.groupby(lst, lambda x: (x['City or Community'], x['State'])) if sum(1 for z in y) > 1] 
# => [('Augusta', 'GA')] 
+1

不錯的方法,但只假設列表中的字典被正確排序*爲groupby正常工作.. – alecxe

+0

@alexce:好點。 Austin Hasting的解決方案更好。 – Amadan

1

嘗試collections.Counter()

import collections 

lst = [{'City or Community': 'Augusta', 'State':'GA', 'Parent Company': 'WoW!'}, 
    {'City or Community': 'Augusta', 'State':'GA', 'Parent Company': 'Comcast'}] 

cntr = collections.Counter(
      [ (d['City or Community'], d['State']) for d in lst ] 
     ) 
+0

非常有幫助謝謝! –

相關問題