简体   繁体   中英

What is the most efficient way to match list of dictionaries?

I have a list of dictionaries like so:

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

What would be the most efficient way to iterate through the list to find instances where a city/state combination has more than 1 result?

This is what I am doing now:

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']):

Try a 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 ]
       )

Here's an approach with 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')]
[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')]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM