我有以下字典列表的输入:
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 = {'a1.txt': {'shareid': 1, 'lid': [6, 8]},
'a2.txt': {'shareid': 2, 'lid': [7]}
}
下面是我写的代码:
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()
我能够生成所需的相同输出。但是,如果有更好的方法来解决这个问题,有人可以指出我吗?
最佳答案
可以使用dict
的setdefault
方法来缩短
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
输出:
{'a2.txt': {'lid': [7], 'shareid': 2}, 'a1.txt': {'lid': [6, 8], 'shareid': 1}}
关于Python 字典列表问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34745591/