首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python字典列表问题

Python字典列表问题
EN

Stack Overflow用户
提问于 2016-01-12 13:55:37
回答 4查看 101关注 0票数 4

我对字典列表有以下输入:

代码语言:javascript
复制
    links = [ {'uid': 1, 'lid': 6, 'path': 'a1.txt', 'shareid': 1},
      {'uid': 1, 'lid': 7, 'path': 'a2.txt', 'shareid': 2},
      {'uid': 1, 'lid': 8, 'path': 'a1.txt', 'shareid': 1}]

我需要生成这个输出:

代码语言:javascript
复制
    op = {'a1.txt': {'shareid': 1, 'lid': [6, 8]},
          'a2.txt': {'shareid': 2, 'lid': [7]}
         }

下面是我编写的代码:

代码语言:javascript
复制
def list_all_links():
       new_list = []
       result = {}

       for i in range(len(links)):
           entry = links[i]

    if not result.has_key(entry['path']):
        new_entry = {}
        lid_list = []
        new_entry['shareid'] = entry['shareid']
        if new_entry.has_key('lid'):
            lid_list = new_entry['lid']
            lid_list.append(entry['lid'])
        else:
            lid_list.append(entry['lid'])
        new_entry['lid'] = lid_list

        result[entry['path']] = new_entry

    else:
        new_entry = result[entry['path']]
        lid_list = new_entry['lid']

        if new_entry.has_key(entry['shareid']):
            new_entry['shareid'] = entry['shareid']
            lid_list = new_entry['lid']
            lid_list.append(entry['lid'])
            new_entry['lid'] = lid_list


        else:
            new_entry['shareid'] = entry['shareid']
            lid_list.append(entry['lid'])
            new_entry['lid'] = lid_list


        result[entry['path']] = new_entry

print "result = %s" %result


if __name__ == '__main__':
    list_all_links()

我能够根据需要生成相同的输出。但是,如果有什么更好的方法来解决这个问题,谁能告诉我呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-01-12 14:16:42

您可以使用setdefault方法的dict使其简短。

代码语言:javascript
复制
links = [
  {'uid': 1, 'lid': 6, 'path': 'a1.txt', 'shareid': 1},
  {'uid': 1, 'lid': 7, 'path': 'a2.txt', 'shareid': 2},
  {'uid': 1, 'lid': 8, 'path': 'a1.txt', 'shareid': 1}
]

op = dict()
for a in links:
  op.setdefault(a['path'], {}).update(shareid=a['shareid'])
  op[a['path']].setdefault('lid', []).append(a['lid'])
print op

输出:

代码语言:javascript
复制
{'a2.txt': {'lid': [7], 'shareid': 2}, 'a1.txt': {'lid': [6, 8], 'shareid': 1}}
票数 0
EN

Stack Overflow用户

发布于 2016-01-12 14:13:19

它并不那么漂亮,但是下面的解决方案是有效的:

代码语言:javascript
复制
links = [ {'uid': 1, 'lid': 6, 'path': 'a1.txt', 'shareid': 1},
      {'uid': 1, 'lid': 7, 'path': 'a2.txt', 'shareid': 2},
      {'uid': 1, 'lid': 8, 'path': 'a1.txt', 'shareid': 1}]

links_restructured = [(d['path'], {'shareid': d['shareid'], 'lid': [d['lid']]}) for d in links]
answer = {}
for link in links_restructured:
    if link[0] not in answer:
        answer[link[0]] = link[1]
    else:
        answer[link[0]]['lid'].extend(link[1]['lid'])
print(answer)

输出

代码语言:javascript
复制
{'a2.txt': {'lid': [7], 'shareid': 2}, 'a1.txt': {'lid': [6, 8], 'shareid': 1}}
票数 0
EN

Stack Overflow用户

发布于 2016-01-12 14:13:56

代码语言:javascript
复制
links = [ {'uid': 1, 'lid': 6, 'path': 'a1.txt', 'shareid': 1},
      {'uid': 1, 'lid': 7, 'path': 'a2.txt', 'shareid': 2},
      {'uid': 1, 'lid': 8, 'path': 'a1.txt', 'shareid': 1}]


def get_links(links):
    new_links = {}
    for x in links:
        path = x.get('path')
        if path in new_links.keys():
            new_links[path]['lid'].append(x['lid'])
        else:
            del x['path']
            del x['uid']
            x['lid'] = [x['lid']]
            new_links[path] = x

    return new_links

print(get_links(links))

输出:

代码语言:javascript
复制
{'a2.txt': {'lid': [7], 'shareid': 2}, 'a1.txt': {'lid': [6, 8], 'shareid': 1}}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34745591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档