簡體   English   中英

Python defaultdict-添加另一個密鑰?

[英]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 我的解決方案是快速將typemany 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM