Python 操作字典数据结构
我有两个大字典,一个是这种结构,我称之为dict_1: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'
{'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。请阅读并遵循帮助文档中的发布指南。适用于这里。在你发布代码并准确描述问题之前,我们无法有效地帮助你。也就是说,组合类似条目的术语是不恰当的。您正在键入两个值条目;这是一个非传统的案例。然而,同样的原则也会有所帮助。我会把这个书签好,明天再看。