以有效的方式取消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到副本。您是否有其他理由选择集合?没有理由,除了集合是专门为擅长操作而设计的。这是蟒蛇式的行为。