输入:
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'}]
Chalange1:如果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'}]
Chalange2:它应该根据唯一的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优化这段代码。。请帮帮我…
这是我的代码
Chalange1:
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)
Chalange2:
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)将字典中的值转换回列表,以获得所需的结果。
Chalange1:
final_result = [*{item['item_type']: item for item in list1 + list2}.values()]
Chalange2:
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)