Python 操作字典数据结构

Python 操作字典数据结构,python,python-2.7,dictionary,Python,Python 2.7,Dictionary,我有两个大字典,一个是这种结构,我称之为dict_1: {'hand': [['hand','ball_1_r1','cake_1'], ['hand','ball_1_r1','cake_2'], ['hand','ball_1_r1','cake_3'], ['hand','ball_1_r2','cake_1'], ['hand','ball_1_r2','cake_2'], ['hand'

我有两个大字典,一个是这种结构,我称之为dict_1:

{'hand': [['hand','ball_1_r1','cake_1'],
          ['hand','ball_1_r1','cake_2'],
          ['hand','ball_1_r1','cake_3'],
          ['hand','ball_1_r2','cake_1'],
          ['hand','ball_1_r2','cake_2'],
          ['hand','ball_1_r2','cake_3'],
          ['hand','ball_2_r1','cake_1'],
          ['hand','ball_2_r1','cake_2'],
          ['hand','ball_2_r1','cake_3'],
          ['hand','ball_2_r2','cake_1'],
          ['hand','ball_2_r2','cake_2'],
          ['hand','ball_2_r2','cake_3']]}
这个结构中的另一个,dict_2:

{'hand': [['hand','ball_1','r1'],
          ['hand','ball_1','r2'],
          ['hand','ball_2','r1'],
          ['hand','ball_2','r2']]}
这两个字典中都有多个条目及其对应的键,但它们的结构都与此处所示的相同。dict_2是dict_1中数据的某种转换,因此:

{'hand': [['hand','ball_1_r1','cake_1'],
          ['hand','ball_1_r1','cake_2'],
          ['hand','ball_1_r1','cake_3']],
等于:

{'hand': ['hand','ball_1','r1'],
我想创建第三个字典,以获取dict_1中与dict_2类似格式的数据,以便“蛋糕”中的所有信息都包含在一个列表中:

{'hand': [['hand','ball_1_r1','cake_1','cake_2','cake_3'],
          ['hand','ball_1_r2','cake_1','cake_2','cake_3'],
          ['hand','ball_2_r1','cake_1','cake_2','cake_3'],
          ['hand','ball_2_r2','cake_1','cake_2','cake_3']]}
到目前为止,我所有的尝试都失败了。我一直在使用一个包含所有键的列表,这在两个字典中都是相同的,用来迭代并尝试生成一个结果:
list\u 1=['hand',…]

因为我知道我的蛋糕值只会在1到3之间,而我的r值只会在1到2之间,所以我想我可以做类似的事情,但我想做一些更一般的事情,而不是像“黑客”那样

new_dict = {}
for values in dict_1.values():
for i in range(0,3):
    if i == 0:
        new_dict['hand'] = [[values[i][i], values[i][i+1], values[i][i+2], values[i+1][i+2], values[i+2][i+2]]]
    if i == 1:
        new_dict['hand'].append([values[i-1][i-1], values[i+2][i], values[i-1][i+1], values[i][i+1], values[i+1][i+1]])
    if i == 2:
        new_dict['hand'].append([values[i-2][i-2], values[i+4][i-1], values[i-2][i], values[i-1][i], values[i][i]])
        new_dict['hand'].append([values[i-2][i-2], values[i+7][i-1], values[i-2][i], values[i-1][i], values[i][i]])

收拾行李时,我突然清醒了一下。 这是你的出发点。你能从这里拿出来吗? itertools.groupby()根据您可以提供的函数,按值收集iterable中的项。我提供了一个函数,它将前两个字段简单地组合成一个元组groupby然后按顺序生成每个分组中的项目

这将返回字典值中的所有条目,按前两个元素(hand和ball)分组;由此,我去掉了最后一个元素,n[2]。我希望您已经知道了足够多的信息,可以将新形成的条目按照您希望的方式放回字典中

import itertools

hand_dict = {'hand': [['hand','ball_1_r1','cake_1'],
                      ['hand','ball_1_r1','cake_2'],
                      ['hand','ball_1_r1','cake_3'],
                      ['hand','ball_1_r2','cake_1'],
                      ['hand','ball_1_r2','cake_2'],
                      ['hand','ball_1_r2','cake_3'],
                      ['hand','ball_2_r1','cake_1'],
                      ['hand','ball_2_r1','cake_2'],
                      ['hand','ball_2_r1','cake_3'],
                      ['hand','ball_2_r2','cake_1'],
                      ['hand','ball_2_r2','cake_2'],
                      ['hand','ball_2_r2','cake_3']]}

for key, value in hand_dict.iteritems():
    # unflatten the entries in "value"
    for k, v in itertools.groupby(value, lambda row: [row[0], row[1]]):
        k.extend([n[2] for n in v])
        print k
输出:

['hand', 'ball_1_r1', 'cake_1', 'cake_2', 'cake_3']
['hand', 'ball_1_r2', 'cake_1', 'cake_2', 'cake_3']
['hand', 'ball_2_r1', 'cake_1', 'cake_2', 'cake_3']
['hand', 'ball_2_r2', 'cake_1', 'cake_2', 'cake_3']

欢迎来到StackOverflow。请阅读并遵循帮助文档中的发布指南。适用于这里。在你发布代码并准确描述问题之前,我们无法有效地帮助你。也就是说,组合类似条目的术语是不恰当的。您正在键入两个值条目;这是一个非传统的案例。然而,同样的原则也会有所帮助。我会把这个书签好,明天再看。