编写优化代码,将以下两个字典列表作为输入并给出输出,因为 final_result.I 已经解决了它,但我想优化
Write optimized code which takes following two list of dictionaries as input and gives output as final_result.I have solved it but I want to optimized
输入:
list1 = [{'item_type':1,'value':55, 'title':'abc'},{'item_type':2,'value':43, 'title':'def'},{'item_type':3,'value':35, 'title':'ghi'}]
list2 = [{'item_type':2,'value':13, 'title':'jkl'},{'item_type':3,'value':85, 'title':'mno'}]
挑战 1:
如果 item_type 出现在 list2 中,那么它应该优先。
预期结果:
final_result = [{'item_type':1,'value':55, 'title':'abc'},{'item_type':2,'value':13, 'title':'jkl'},{'item_type':3,'value':85, 'title':'mno'}]
挑战 2:
它应该根据唯一性 item_type 合并 list1 和 list2,并保留较高的 'value' 字典。
预期结果:
final_result = [{'item_type':1,'value':55, 'title':'abc'},{'item_type':2,'value':43, 'title':'def'},{'item_type':3,'value':85, 'title':'mno'}]
.
我已经解决了这两个挑战,但我想使用综合列表 lambda 优化此代码。请帮助我...
这是我的代码
挑战 1:
final_result = []
list1 = [{'item_type':1,'value':55, 'title':'abc'},{'item_type':2,'value':43, 'title':'def'},{'item_type':3,'value':35, 'title':'ghi'}]
list2 = [{'item_type':2,'value':13, 'title':'jkl'},{'item_type':3,'value':85, 'title':'mno'}]
for i in range(len(list1)):
for j in range(len(list2)):
if list1[i]['item_type'] == list2[j]['item_type']:
if list1[i]['item_type'] < list2[j]['item_type']:
final_result.append(list1[i])
else:
final_result.append(list2[j])
break
else:
final_result.append(list1[i])
print(final_result)
挑战 2:
final_result = []
list1 = [{'item_type':1,'value':55, 'title':'abc'},{'item_type':2,'value':43, 'title':'def'},{'item_type':3,'value':35, 'title':'ghi'}]
list2 = [{'item_type':2,'value':13, 'title':'jkl'},{'item_type':3,'value':85, 'title':'mno'}]
for i in range(len(list1)):
for j in range(len(list2)):
if list1[i]['item_type'] == list2[j]['item_type']:
if list1[i]['value'] > list2[j]['value']:
final_result.append(list1[i])
else:
final_result.append(list2[j])
break
else:
final_result.append(list1[i])
print(final_result)
所以您想使用列表(或其他)理解。
从Python3.7开始,词典正式订购。您可以 (1) 连接列表并在必要时对项目进行排序,(2) 将项目放入以 item_type
作为键的字典中,以及 (3) 将字典中的值转换回列表,以获得想要的结果。
挑战1:
final_result = [*{item['item_type']: item for item in list1 + list2}.values()]
挑战2:
final_result = [*{item['item_type']: item for item in sorted(list1 + list2, key=lambda item: (item['item_type'], item['value']))}.values()]
根据问题中陈述的信息。
第一个挑战是合并两个列表,并优先于第二个列表。一个快速的解决方案可以是:
list1 = [
{'item_type':1,'value':55, 'title':'abc'},
{'item_type':2,'value':43, 'title':'def'},
{'item_type':3,'value':35, 'title':'ghi'}
]
list2 = [
{'item_type':2,'value':13, 'title':'jkl'},
{'item_type':3,'value':85, 'title':'mno'}
]
final_result = [
item for item in list1
if item['item_type'] not in
[item['item_type'] for item in list2]
] + list2
print(final_result)
第二个挑战是合并优先级为 value
的两个列表。一个快速的解决方案可以是:
list1 = [
{'item_type':1,'value':55, 'title':'abc'},
{'item_type':2,'value':43, 'title':'def'},
{'item_type':3,'value':35, 'title':'ghi'}
]
list2 = [
{'item_type':2,'value':13, 'title':'jkl'},
{'item_type':3,'value':85, 'title':'mno'}
]
isNotIn = lambda item, L: len(
[el['item_type'] for el in L
if item['item_type'] == el['item_type']]
) == 0
isHigher = lambda item, L: len(
[el['item_type'] for el in L
if item['item_type'] == el['item_type'] and
item['value'] > el['value']]
) > 0
final_result = [el for el in list1 if (isNotIn(el, list2) or isHigher(el, list2))] + \
[el for el in list2 if (isNotIn(el, list1) or isHigher(el, list1))]
print(final_result)
输入:
list1 = [{'item_type':1,'value':55, 'title':'abc'},{'item_type':2,'value':43, 'title':'def'},{'item_type':3,'value':35, 'title':'ghi'}]
list2 = [{'item_type':2,'value':13, 'title':'jkl'},{'item_type':3,'value':85, 'title':'mno'}]
挑战 1: 如果 item_type 出现在 list2 中,那么它应该优先。
预期结果:
final_result = [{'item_type':1,'value':55, 'title':'abc'},{'item_type':2,'value':13, 'title':'jkl'},{'item_type':3,'value':85, 'title':'mno'}]
挑战 2: 它应该根据唯一性 item_type 合并 list1 和 list2,并保留较高的 'value' 字典。
预期结果:
final_result = [{'item_type':1,'value':55, 'title':'abc'},{'item_type':2,'value':43, 'title':'def'},{'item_type':3,'value':85, 'title':'mno'}]
.
我已经解决了这两个挑战,但我想使用综合列表 lambda 优化此代码。请帮助我...
这是我的代码
挑战 1:
final_result = []
list1 = [{'item_type':1,'value':55, 'title':'abc'},{'item_type':2,'value':43, 'title':'def'},{'item_type':3,'value':35, 'title':'ghi'}]
list2 = [{'item_type':2,'value':13, 'title':'jkl'},{'item_type':3,'value':85, 'title':'mno'}]
for i in range(len(list1)):
for j in range(len(list2)):
if list1[i]['item_type'] == list2[j]['item_type']:
if list1[i]['item_type'] < list2[j]['item_type']:
final_result.append(list1[i])
else:
final_result.append(list2[j])
break
else:
final_result.append(list1[i])
print(final_result)
挑战 2:
final_result = []
list1 = [{'item_type':1,'value':55, 'title':'abc'},{'item_type':2,'value':43, 'title':'def'},{'item_type':3,'value':35, 'title':'ghi'}]
list2 = [{'item_type':2,'value':13, 'title':'jkl'},{'item_type':3,'value':85, 'title':'mno'}]
for i in range(len(list1)):
for j in range(len(list2)):
if list1[i]['item_type'] == list2[j]['item_type']:
if list1[i]['value'] > list2[j]['value']:
final_result.append(list1[i])
else:
final_result.append(list2[j])
break
else:
final_result.append(list1[i])
print(final_result)
所以您想使用列表(或其他)理解。
从Python3.7开始,词典正式订购。您可以 (1) 连接列表并在必要时对项目进行排序,(2) 将项目放入以 item_type
作为键的字典中,以及 (3) 将字典中的值转换回列表,以获得想要的结果。
挑战1:
final_result = [*{item['item_type']: item for item in list1 + list2}.values()]
挑战2:
final_result = [*{item['item_type']: item for item in sorted(list1 + list2, key=lambda item: (item['item_type'], item['value']))}.values()]
根据问题中陈述的信息。
第一个挑战是合并两个列表,并优先于第二个列表。一个快速的解决方案可以是:
list1 = [
{'item_type':1,'value':55, 'title':'abc'},
{'item_type':2,'value':43, 'title':'def'},
{'item_type':3,'value':35, 'title':'ghi'}
]
list2 = [
{'item_type':2,'value':13, 'title':'jkl'},
{'item_type':3,'value':85, 'title':'mno'}
]
final_result = [
item for item in list1
if item['item_type'] not in
[item['item_type'] for item in list2]
] + list2
print(final_result)
第二个挑战是合并优先级为 value
的两个列表。一个快速的解决方案可以是:
list1 = [
{'item_type':1,'value':55, 'title':'abc'},
{'item_type':2,'value':43, 'title':'def'},
{'item_type':3,'value':35, 'title':'ghi'}
]
list2 = [
{'item_type':2,'value':13, 'title':'jkl'},
{'item_type':3,'value':85, 'title':'mno'}
]
isNotIn = lambda item, L: len(
[el['item_type'] for el in L
if item['item_type'] == el['item_type']]
) == 0
isHigher = lambda item, L: len(
[el['item_type'] for el in L
if item['item_type'] == el['item_type'] and
item['value'] > el['value']]
) > 0
final_result = [el for el in list1 if (isNotIn(el, list2) or isHigher(el, list2))] + \
[el for el in list2 if (isNotIn(el, list1) or isHigher(el, list1))]
print(final_result)