所以我有一个像这样的词典列表:
data = [ {
'Organization' : '123 Solar',
'Phone' : '444-444-4444',
'Email' : '',
'website' : 'www.123solar.com'
}, {
'Organization' : '123 Solar',
'Phone' : '',
'Email' : 'joey@123solar.com',
'Website' : 'www.123solar.com'
}, {
etc...
} ]
当然,这不是确切的数据。但是(也许)从我的例子中你可以发现我的问题。我有许多具有相同“组织”名称的记录,但其中没有一个记录具有该记录的完整信息。
是否有高效方法搜索列表,根据字典的第一个条目对列表进行排序,最后合并重复数据以创建唯一条目? (请记住这些词典非常大)
答案 0 :(得分:3)
您可以使用itertools.groupby:
from itertools import groupby
from operator import itemgetter
from pprint import pprint
data = [ {
'Organization' : '123 Solar',
'Phone' : '444-444-4444',
'Email' : '',
'website' : 'www.123solar.com'
}, {
'Organization' : '123 Solar',
'Phone' : '',
'Email' : 'joey@123solar.com',
'Website' : 'www.123solar.com'
},
{
'Organization' : '234 test',
'Phone' : '111',
'Email' : 'a@123solar.com',
'Website' : 'b.123solar.com'
},
{
'Organization' : '234 test',
'Phone' : '222',
'Email' : 'ac@123solar.com',
'Website' : 'bd.123solar.com'
}]
data = sorted(data, key=itemgetter('Organization'))
result = {}
for key, group in groupby(data, key=itemgetter('Organization')):
result[key] = [item for item in group]
pprint(result)
打印:
{'123 Solar': [{'Email': '',
'Organization': '123 Solar',
'Phone': '444-444-4444',
'website': 'www.123solar.com'},
{'Email': 'joey@123solar.com',
'Organization': '123 Solar',
'Phone': '',
'Website': 'www.123solar.com'}],
'234 test': [{'Email': 'a@123solar.com',
'Organization': '234 test',
'Phone': '111',
'Website': 'b.123solar.com'},
{'Email': 'ac@123solar.com',
'Organization': '234 test',
'Phone': '222',
'Website': 'bd.123solar.com'}]}
UPD:
以下是将项目分组为单个词典的方法:
for key, group in groupby(data, key=itemgetter('Organization')):
result[key] = {'Phone': [],
'Email': [],
'Website': []}
for item in group:
result[key]['Phone'].append(item['Phone'])
result[key]['Email'].append(item['Email'])
result[key]['Website'].append(item['Website'])
然后,在result
中你将拥有:
{'123 Solar': {'Email': ['', 'joey@123solar.com'],
'Phone': ['444-444-4444', ''],
'Website': ['www.123solar.com', 'www.123solar.com']},
'234 test': {'Email': ['a@123solar.com', 'ac@123solar.com'],
'Phone': ['111', '222'],
'Website': ['b.123solar.com', 'bd.123solar.com']}}
答案 1 :(得分:2)
是否有一种有效的搜索列表的方法,根据字典的第一个条目对列表进行排序,最后合并重复的数据以创建唯一的条目?
是的,但是没有搜索和排序的方法更有效。你可以随便建立一本字典:
datadict = {}
for thingy in data:
organization = thingy['Organization']
datadict[organization] = merge(thingy, datadict.get(organization, {}))
现在您对数据进行线性传递,对每个数据进行恒定时间查找。因此,它比任何排序的解决方案都要好O(log N)。它也是一次通过而不是多次通过,除了它之外它可能会有更低的常数开销。
目前尚不清楚你想要做什么来合并条目,并且在不知道你想要使用什么规则的情况下,任何人都无法编写代码。但这是一个简单的例子:
def merge(d1, d2):
for key, value in d2.items():
if not d1.get(key):
d1[key] = value
return d1
换句话说,对于d2
中的每个项目,如果d1
已经有一个真值(如非空字符串),请不要管它;否则,加上它。