簡體   English   中英

使用 Python 中的列表理解比較並在 dict 中添加新鍵

[英]Compare and add new key in dict using list Comprehension in Python

我正在嘗試通過 key = 'TABLE' 比較兩個 dicts 列表,如果兩個 dicts 中的 'TABLE' 的值相同,那么我需要減去 'MB' 的值。

list1 = [{'TABLE':'A', 'MB':110, 'INFO':'No'}, {'TABLE':'B', 'MB':200, 'INFO':'YES'}]
list2 = [{'TABLE':'A', 'MB':101, 'INFO':'No'}, {'TABLE':'B', 'MB':220, 'INFO':'YES'}]

結果我想在dict的第一個列表中添加一個新鍵='DIFF'。 我發現了差異,但我不知道如何在我的情況下在列表理解中添加新的鍵/值。

diff = [[item['MB'] - table['MB']] for table in list1 for item in list2 if item['TABLE'] == table['TABLE']]

我的期望是得到 list1 如下:

list1 = [{'TABLE':'A', 'MB':110, 'INFO':'No', 'DIFF': -9}, {'TABLE':'B', 'MB':200, 'INFO':'YES', 'DIFF':20}]

提前致謝。

您可以將雙 for 循環用作:

for d1 in list1:
    for d2 in list2:
        if d1['TABLE'] == d2['TABLE']:
            d1['DIFF'] = d2['MB'] - d1['MB']

Output:

>>> print(list1)
[{'TABLE': 'A', 'MB': 110, 'INFO': 'No', 'DIFF': -9},
 {'TABLE': 'B', 'MB': 200, 'INFO': 'YES', 'DIFF': 20}]

是否有特定的理由為此任務使用列表推導。 對我來說,這是一個更簡潔的嵌套 for 循環。 它更易於閱讀並避免在列表推導中使用副作用。

list1 = [{'TABLE':'A', 'MB':110, 'INFO':'No'}, {'TABLE':'B', 'MB':200, 'INFO':'YES'}]
list2 = [{'TABLE':'A', 'MB':101, 'INFO':'No'}, {'TABLE':'B', 'MB':220, 'INFO':'YES'}]
diff = [[item['MB'] - table['MB']] for table in list1 for item in list2 if item['TABLE'] == table['TABLE']]
for l1 in list1:
    for l2 in list2:
        if l1['TABLE'] == l2['TABLE']:
            l1['DIFF'] = l1['MB'] - l2['MB']
print(f"{list1=}")

OUTPUT

list1=[{'TABLE': 'A', 'MB': 110, 'INFO': 'No', 'DIFF': 9}, {'TABLE': 'B', 'MB': 200, 'INFO': 'YES', 'DIFF': -20}]

這是一種稍微更有效的雙循環方法。 這避免了從 list1 中查找 TABLE 值的次數超出必要的次數:

list1 = [{'TABLE':'A', 'MB':110, 'INFO':'No'}, {'TABLE':'B', 'MB':200, 'INFO':'YES'}]
list2 = [{'TABLE':'A', 'MB':101, 'INFO':'No'}, {'TABLE':'B', 'MB':220, 'INFO':'YES'}]

for d1 in list1:
    v1 = d1['TABLE']
    for d2 in list2:
        if (v2 := d2['TABLE']) == v1:
            d1['DIFF'] = d2['MB'] - d1['MB']
print(list1)

如果任何字典中缺少 TABLE 或 MB 鍵,則會因 KeyError 而失敗。

Output:

[{'TABLE': 'A', 'MB': 110, 'INFO': 'No', 'DIFF': -9}, {'TABLE': 'B', 'MB': 200, 'INFO': 'YES', 'DIFF': 20}]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM