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.