5

所以我有一个像这样的字典列表:

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...
         } ]

当然,这不是确切的数据。但是(也许)从我这里的例子中你可以发现我的问题。我有许多具有相同“组织”名称的记录,但没有一条具有该记录的完整信息。

是否有一种有效的方法来搜索列表,根据字典的第一个条目对列表进行排序,最后合并重复项中的数据以创建唯一条目?(请记住,这些词典非常大)

4

2 回答 2

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'}]}

升级版:

以下是将项目分组到单个字典中的方法:

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']}}
于 2013-08-27T19:23:33.720 回答
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已​​经有一个真值(如非空字符串),则不要理会它;否则,添加它。

于 2013-08-27T19:24:26.543 回答