[英]Python defaultdict - add another key?
我可能在這里沒有使用正確的詞,但是基本上我想在提供的第一個鍵旁邊添加另一個鍵。
這是我目前擁有的:
def transform_result(self, data):
type_map = defaultdict(list)
for entry in data:
type_map[entry['type']].append({
'id': entry['id'],
'tag': entry['tag'],
})
ret = []
for key, value, in type_map.items():
ret.append({
'type': key,
'tags': value,
})
return ret
輸入:
[
OrderedDict([
('id', 1),
('type', 'Color'),
('writable', True),
('tag', 'Blue')
]),
OrderedDict([
('id', 2),
('type', 'Color'),
('writable', True),
('tag', 'Red')
]),
OrderedDict([
('id', 3),
('type', 'Color'),
('writable', True),
('tag', 'Green')
]),
OrderedDict([
('id', 4),
('type', 'Shape'),
('writable', False),
('tag', 'Square')
]),
OrderedDict([
('id', 5),
('type', 'Shape'),
('writable', False),
('tag', 'Circle')
])
]
所需的輸出:
[
{
'type': 'Color',
'writable': True,
'tags': [
{
'tag': 'Blue',
'id': 1
},
{
'tag': 'Red',
'id': 2
},
{
'tag': 'Green',
'id': 3
}
]
},
{
'type': 'Shape',
'writable': False,
'tags': [
{
'tag': 'Square',
'id': 4
},
{
'tag': 'Circle',
'id': 5
},
]
},
]
應該如何完成?
編輯:我明白了,對不起,我完全是橡膠鴨子。 這是我的解決方案:
def transform_result(self, data):
type_map = defaultdict(list)
for entry in data:
type_map[entry['type'], entry['many']].append({
'id': entry['id'],
'tag': entry['tag'],
})
ret = []
for key, value, in type_map.items():
ret.append({
'type': key[0],
'many': key[1],
'tags': value
})
return ret
基本上,令我困惑的是在第一個循環完成后如何訪問many
。 我的解決方案是快速將type
和many
type
放入一個小的列表中,然后使用[0]
和[1]
訪問它們,它可以正常工作!
這是一個建議,請注意,此解決方案為n * lg(n),可以解決n中的問題,但是如果您沒有非常大的數據集,那就沒關系了。 用它作為靈感;)
from collections import OrderedDict
from itertools import groupby
from operator import itemgetter
from pprint import pprint
foo = [
OrderedDict([
('id', 1),
('type', 'Color'),
('writable', True),
('tag', 'Blue')
]),
...
...
...
OrderedDict([
('id', 5),
('type', 'Shape'),
('writable', False),
('tag', 'Circle')
])
]
def transform_result(data):
key_func = itemgetter('type')
for g, items in groupby(sorted(foo, key=key_func), key=key_func):
item = {'type': g, 'tags': []}
for i in items:
item['writeable'] = i['writable']
item['tags'].append({'tag': i['tag'], 'id': i['id']})
yield item
pprint(list(transform_result(foo)))
輸出量
[{'tags': [{'id': 1, 'tag': 'Blue'},
{'id': 2, 'tag': 'Red'},
{'id': 3, 'tag': 'Green'}],
'type': 'Color',
'writeable': True},
{'tags': [{'id': 4, 'tag': 'Square'}, {'id': 5, 'tag': 'Circle'}],
'type': 'Shape',
'writeable': False}]
我不能說我喜歡您的數據模型,但是對於您給定的輸入和所需的輸出,您幾乎擁有了它:
def transform_result(self, data):
type_map = defaultdict(list)
for entry in data:
type_map[entry['type'], entry['writable']].append({
'id': entry['id'],
'tag': entry['tag'],
})
ret = []
for (k_type, k_writable), value in type_map.items():
ret.append({
'type': k_type,
'writable': k_writable,
'tags': value,
})
return ret
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.