32694

[code]

    persons = [{"ID": 1001, "NAME": "YAMANE", "AGE": 31},
               {"ID": 1001, "NAME": "SHIMADA", "AGE": 51},
               {"ID": 1002, "NAME": "AMANE", "AGE": 13},
               {"ID": 1003, "NAME": "OKADA", "AGE": 21}]
    
[/code]

が入っています。注目点としてIDは重複します。

こちらを↓のような形にしたいです。

[code]

    persons[[1001][{"NAME": "YAMANE", "AGE": 31},{"NAME": "SHIMADA", "AGE": 51}],
          [1002][{"NAME": "AMANE", "AGE": 13}],
          [1003][{"NAME": "OKADA", "AGE": 21}]]
    
[/code]

pymysqlのfetchallを使用すると、データベースの行ごとにdict形式で配列されます。

私が試して失敗した例：

[code]

    person_box = []
    for person in persons:
        person_box[person['ID']] = person
    
[/code]


CC BY-SA 3.0
2017-02-15T18:19:01.367
32693
2017-02-16T01:20:08.730
7973
question
python
Python dictを識別番号式にする


defaultdict使えばできるのではないでしょうか？  

[code]

    from collections import defaultdict
    
    persons = [{"ID": 1001, "NAME": "YAMANE", "AGE": 31},
               {"ID": 1001, "NAME": "SHIMADA", "AGE": 51},
               {"ID": 1002, "NAME": "AMANE", "AGE": 13},
               {"ID": 1003, "NAME": "OKADA", "AGE": 21}]
    
    person_box = defaultdict(list)
    for person in persons:
        person_box[person['ID']].append(person)
    
[/code]


CC BY-SA 3.0
2017-02-15T21:13:32.340
32694
2017-02-15T21:13:32.340
20638
32693
answer


別解として `itertools.groupby()` を使う方法などを。

[code]

    >>> import itertools
    >>> import pprint
    >>> person_box = {
          k: [{i: j for i, j in d.iteritems() if i!='ID'} for d in v]
          for k, v in itertools.groupby(persons, key=lambda x: x['ID'])
        }
    >>> pprint.pprint(person_box)
    {1001: [{'AGE': 31, 'NAME': 'YAMANE'}, {'AGE': 51, 'NAME': 'SHIMADA'}],
     1002: [{'AGE': 13, 'NAME': 'AMANE'}],
     1003: [{'AGE': 21, 'NAME': 'OKADA'}]}
    
[/code]


CC BY-SA 3.0
2017-02-16T01:20:08.730
32697
2017-02-16T01:20:08.730
32693
answer