Python 基于关键字名称在列表上分组dict元素

Python 基于关键字名称在列表上分组dict元素,python,python-3.x,dictionary,Python,Python 3.x,Dictionary,我想根据dict keys名称将dict keys分组到dict列表中。dict键以数字开头,例如: {'1_account_id': '5', '1_qty_in': '10.01', '1_uom_in': '1', '2_account_id': '23', '2_qty_in': '2.01', '2_uom_in': '1','3_account_id': '23', '3_qty_in': '2.01', '3_uom_in': '1' ,'some_x':1,'some_y':0}

我想根据dict keys名称将dict keys分组到dict列表中。dict键以数字开头,例如:

{'1_account_id': '5', '1_qty_in': '10.01', '1_uom_in': '1', '2_account_id': '23', '2_qty_in': '2.01', '2_uom_in': '1','3_account_id': '23', '3_qty_in': '2.01', '3_uom_in': '1' ,'some_x':1,'some_y':0}
我想将其转换为按以下数字分组的列表:

[{'1':{account_id': '5','qty_in':10.01,'uom_in':1}},{'2':{account_id': '23','qty_in':2.01,'uom_in':1}}....] etc
这个数字不是静态的

我尝试了多种解决方案,但似乎不利于性能: 就像我循环了0到某个大数字的范围,但这不是一个好的解决方案

我还尝试先循环抛出元素来提取数字,然后再循环到group,但是dict myaybe没有干净,因为它还有其他不需要的键

我该怎么办

Mostafa

您可以运行以下代码示例来解决此问题:

example_dict = {'1_account_id': '5', '1_qty_in': '10.01', '1_uom_in': '1', '2_account_id': '23', '2_qty_in': '2.01', '2_uom_in': '1','3_account_id': '23', '3_qty_in': '2.01', '3_uom_in': '1' ,'some_x':1,'some_y':0}
desired_keys = ['account_id','qty_in','uom_in']

result = {}
for key,value in example_dict.items():
  key_num, key_name = key.split('_', 1)
  if key_name in desired_keys:
    result.setdefault(key_num, {})[key_name] = value

print(result)

{'1': {'accountid': '5', 'qtyin': '10.01', 'uomin': '1'}, '2': {'accountid': '23', 'qtyin': '2.01', 'uomin': '1'}, '3': {'accountid': '23', 'qtyin': '2.01', 'uomin': '1'}, 'some': {'x': 1, 'y': 0}}
它将打印(根据您的需要):


如果你不懂什么,请告诉我。

因此,给定输入
d

d={'1账户id':'5','1账户id':'10.01','1账户id':'1','2账户id':'23','2账户id':'2.01','2账户id':'1','3账户id':'23','3账户id':'2.01','3账户id':'1','1','0}
ans={}
对于输入d:
n、 k=键拆分(“1”)
如果在ans中为n:
ans[n][k]=d[key]
其他:
ans[n]={'account\u id':0,'qty\u in':0,'uom\u in':0}
ans[n][k]=d[key]
上述代码生成以下输出,其中整个输出
ans
是一个以数字为键的字典,每个键的值也是一个字典,每个包含3个键和相应的值:

{'1': {'account_id': '5', 'qty_in': '10.01', 'uom_in': '1'},
 '2': {'account_id': '23', 'qty_in': '2.01', 'uom_in': '1'},
 '3': {'account_id': '23', 'qty_in': '2.01', 'uom_in': '1'},
 'some': {'account_id': 0, 'qty_in': 0, 'uom_in': 0, 'x': 1, 'y': 0}}
现在,要将其转换为所需输出中显示的列表,请使用以下代码。这里,我们将词典转换为包含词典的列表

ans2=[]
对于ans中的行:
温度={}
临时[行]=ans[行]
ans2.附加(临时)
它产生所需的输出:

 [{'1': {'account_id': '5', 'qty_in': '10.01', 'uom_in': '1'}},
 {'2': {'account_id': '23', 'qty_in': '2.01', 'uom_in': '1'}},
 {'3': {'account_id': '23', 'qty_in': '2.01', 'uom_in': '1'}},
 {'some': {'account_id': 0, 'qty_in': 0, 'uom_in': 0, 'x': 1, 'y': 0}}]

希望这有帮助

你能给出准确的期望输出吗?不清楚您想用
'some\u x'
'some\u y'
做什么。我想忽略some。。我不需要此目录中的任何其他键,只需要帐户id、数量、计量单位。原始数据存储在哪里?在文本文件中?当然,只要做一个if。。。我把它改成可以用的。现在很好用。
 [{'1': {'account_id': '5', 'qty_in': '10.01', 'uom_in': '1'}},
 {'2': {'account_id': '23', 'qty_in': '2.01', 'uom_in': '1'}},
 {'3': {'account_id': '23', 'qty_in': '2.01', 'uom_in': '1'}},
 {'some': {'account_id': 0, 'qty_in': 0, 'uom_in': 0, 'x': 1, 'y': 0}}]