Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
以有效的方式取消python字典的框架_Python_Dictionary - Fatal编程技术网

以有效的方式取消python字典的框架

以有效的方式取消python字典的框架,python,dictionary,Python,Dictionary,假设您有这样一个字典列表: {'id':1, 'station': 'LYO', 'country': 'France', 'classes': 'EU', 'label': 'LYO CS', 'color': 'orange', 'population':100000, 'university':yes} 我想创建: {'data':{'id':1, 'station': 'LYO', 'country': 'France'}, 'classes': 'EU

假设您有这样一个字典列表:

{'id':1,
'station': 'LYO',
'country': 'France',
'classes': 'EU',
'label': 'LYO CS',
'color': 'orange',
'population':100000,
'university':yes}
我想创建:

{'data':{'id':1,
        'station': 'LYO',
        'country': 'France'},
'classes': 'EU',
'label': 'LYO CS',
'color': 'orange',
'population':100000,
'university':yes}
基本上在数据子字典中包含数据项的键值=['id'、'station'、'country']

要做到这一点,显然还有很长的路要走:

data_keys = ['id','station']
data_sub_dict = {'data':{el:node[el] for el in data_keys}}
rest_sub_dict = {el:node[el] for el in node.keys() if el not in data_keys}
dict_result ={}
dict_result.update(data_sub_dict)
dict_result.update(rest_sub_dict)
这没关系,但我觉得它不是很像蟒蛇

你会不这样做吗?(是否更紧凑?,还有其他方法吗?)


谢谢

我建议编写一个函数,将字典一分为二,同时提供键列表:

def filterByKeys(d,keys):
    a={}; b={};
    for k in d:
        if k in keys: a[k] = d[k]
        else :        b[k] = d[k]
    return (a,b)
    
d1, d2 = filterByKeys(d,['id','station'])
{'data':d1,**d2}

虽然这种方法不使用列表理解来迭代字典,但它变得非常容易理解。

为什么
update
s

可以使用
dict
构造函数在一条指令中编写所有指令:

data={'id':1,
‘车站’:‘LYO’,
‘国家’:‘法国’,
“类”:“EU”,
“标签”:“LYO CS”,
“颜色”:“橙色”,
“人口”:100000,
“大学”:“是的”
口述(
{'data':{k:v代表k,v在data.items()中,如果k在('id','station','country')},
**{k:v表示k,v表示data.items()中的k('classes','color','population','university'))
结果:

{'data': {'id': 1, 'station': 'LYO', 'country': 'France'},
 'classes': 'EU',
 'color': 'orange',
 'population': 100000,
 'university': 'yes'}

你可以缩短最后三行:
dict\u result={**data\u sub\u dict,**rest\u sub\u dict}
我不会专注于编写尽可能“压缩”的代码。可读性比代码紧凑性更有价值。您喜欢调试一些写得很清楚的功能,还是在一行上调试尽可能多的逻辑?@JLeno46我觉得代码可以更好。“不仅仅是更好,”马克说。瞧!!!这就是我要找的。非常适合阅读。而且非常紧凑。因为这也可以在有其他字典需要“相加”时使用。你为什么要将
作为列表而不是集合传递?一点也不。其实也许设置得更好。我根本不是一个强大的用户,主要是出于习惯。性能方面的集合是更好的选择,尤其是wrt到副本。您是否有其他理由选择集合?没有理由,除了集合是专门为擅长操作而设计的。这是蟒蛇式的行为。