我有一本字典,例如:
{
"number_1":
{
"month_year": "5/2022",
"price": 1,
"average": 1,
"covered": 1,
},
"number_2":
{
"month_year": "5/2022",
"price": 1,
"average": 1,
"covered": 1,
},
"number_3":
{
"month_year": "4/2022",
"price": 10,
"average": 93,
"covered": 100,
},
"number_4":
{
"month_year": "4/2022",
"price": 10,
"average": 93,
"covered": 100,
},
}
generic如果字典的鍵值相同,我需要一種方法來獲取值的總和,month_year例如,month_year 5/2022它將是:
{
"month_year": "5/2022",
"total_price": 2,
"total_average": 2,
"total_covered": 2,
}
uj5u.com熱心網友回復:
我認為現有的答案要么太復雜,要么不夠通用。這應該適用于所有新欄位(假設它們仍然是數字),并且依賴內置collections來完成大部分繁重的作業。
from collections import defaultdict, Counter
def group(mappings):
dict_by_date = defaultdict(Counter)
for mapping in mappings.values():
date = mapping["month_year"]
fields = {k: v for k, v in mapping.items() if k != "month_year"}
dict_by_date[date].update(fields)
return [{"month_year": date, **fields} for date, fields in dict_by_date.items()]
示例的結果:
>>> from pprint import pprint
>>> pprint(group(test))
[{'average': 2, 'covered': 2, 'month_year': '5/2022', 'price': 2},
{'average': 186, 'covered': 200, 'month_year': '4/2022', 'price': 20}]
uj5u.com熱心網友回復:
您可以使用with作為鍵d對具有相同值的所有元素進行分組。d['month_year']dictd['month_year']
data = {
"number_1":
{"month_year": "5/2022", "price": 1, "average": 1, "covered": 1},
"number_2":
{"month_year": "5/2022", "price": 1, "average": 1, "covered": 1},
"number_3":
{"month_year": "4/2022", "price": 10, "average": 93, "covered": 100},
"number_4":
{"month_year": "4/2022", "price": 10, "average": 93, "covered": 100},
}
result = {}
for d in data.values():
if d['month_year'] in result:
for k in ('price', 'average', 'covered'):
result[d['month_year']][k] = d[k]
else:
result[d['month_year']] = dict(d)
print(result)
# {'5/2022': {'month_year': '5/2022', 'covered': 2, 'price': 2, 'average': 2},
# '4/2022': {'month_year': '4/2022', 'covered': 200, 'price': 20, 'average': 186}}
uj5u.com熱心網友回復:
與您可能已經看到的其他答案一樣,您的字典格式不正確。因為您的子字典在字典中,所以您也必須給它們一個鍵。這是一個例子:
{
"1st Dictionary": {
"month_year": "5/2022",
"price": 1,
"average": 1,
"covered": 1,
},
"2nd Dictionary": {
"month_year": "5/2022",
"price": 1,
"average": 1,
"covered": 1,
},
"3rd Dictionary": {
"month_year": "4/2022",
"price": 10,
"average": 93,
"covered": 100,
},
"4th Dictionary": {
"month_year": "4/2022",
"price": 10,
"average": 93,
"covered": 100,
},
}
在這里,您給每個子詞典一個鍵。每個鍵都簡單地說明它是字典中的哪個字典。這是另一種方法:
{
0: {
"month_year": "5/2022",
"price": 1,
"average": 1,
"covered": 1,
},
1: {
"month_year": "5/2022",
"price": 1,
"average": 1,
"covered": 1,
},
2: {
"month_year": "4/2022",
"price": 10,
"average": 93,
"covered": 100,
},
3: {
"month_year": "4/2022",
"price": 10,
"average": 93,
"covered": 100,
},
}
除了使用數字 0-3 之外,這也是一樣的。這可能是一個更好的主意,因為這樣您就可以提供類似于索引的鍵。
現在回到你的問題!如果您想獲得這些字典中的任何一個的某個索引,您首先必須使用所述字典定義一個變數,然后在變數旁邊的括號內鍵入鍵(類似于串列)。為簡單起見,我將使用第一本字典。這就是我所說的:
dictionary={
"1st Dictionary": {
"month_year": "5/2022",
"price": 1,
"average": 1,
"covered": 1,
},
"2nd Dictionary": {
"month_year": "5/2022",
"price": 1,
"average": 1,
"covered": 1,
},
"3rd Dictionary": {
"month_year": "4/2022",
"price": 10,
"average": 93,
"covered": 100,
},
"4th Dictionary": {
"month_year": "4/2022",
"price": 10,
"average": 93,
"covered": 100,
},
}
if dictionary["1st Dictionary"]["price"]>1:
print("if statement ran successfully!")
elif dictionary["1st Dictionary"]["price"]==1:
print("elif statement ran successfully!")
在這里,輸出是:elif 陳述句運行成功!
我們在這里所做的是獲取命名的鍵“1st Dictionary”,然后在“price”所述字典中命名鍵。這是使用串列的此行為的示例:
my_list=[
[1,2,3],
["a","b","c"],
[0.1,0.2,0.3]
]
if my_list[0][1]==2:
print("if statement ran successfully!")
如果我們運行這段代碼,我們會得到輸出:if 陳述句運行成功!
這里我們檢查第一個串列中的第二個索引my_list是否等于 2。為了清楚起見,在這里您可以看到第一個索引my_list是[1,2,3],并且第一個索引的第二個索引my_list是 2。
my_list[0]==[1,2,3]
my_list[0][1]==2
希望這以簡單易懂的方式回答了您的問題!
uj5u.com熱心網友回復:
您可以嘗試以下解決方案如果您有類似的相鄰鍵,請嘗試@steff 解決方案
#假設您有字典串列 bcz 字典集是不可能的,因為不可散列型別的字典
a = [{"month_year": "5/2022","price": 1,"average": 1,"covered": 1,
},{"month_year": "5/2022","price": 1,"average": 1,"covered": 1,},{"month_year": "4/2022","price": 10,"average": 93,"covered": 100,},{"month_year": "4/2022","price": 10,"average": 93,"covered": 100,},]
from itertools import groupby
from collections import Counter
a.sort(key=lambda x: x["month_year"]) # We need to do this because groupby needs data in sorted manner
print([ {**sum((Counter(vals) for vals in val if (_:=vals.pop("month_year")) and (not print(vals))), Counter()), **{"month_year": key}} for key, val in groupby(a, key=lambda x: x["month_year"])])
# output [{'price': 20, 'average': 186, 'covered': 200, 'month_year': '4/2022'}, {'price': 2, 'average': 2, 'covered': 2, 'month_year': '5/2022'}]
說明:首先 groupby 與鍵month_year我們得到了唯一鍵的月份_年和我們應用的那個組的值串列(使用 的兩個字典的總和Counter),然后將我的鍵放回結果字典中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/471066.html
標籤:Python python-3.x 列表 算法 字典
