[英]How to effectively compare two lists of dictionaries to declare a “winner”
我在词典列表中有以下数据。 如何根据以下规则有效地比较这两者,并得出谁是赢家?
如果列表中的任何一个值大于另一个列表的所有其他值,则具有较大值的列表将被宣布为赢家。
s1=[{'link': 0}, {'link': 0}]
s2=[{'link': 0}, {'link': 1}]
我的尝试是:
for stat in s2:
for stat1 in s1:
if stat['link'] >= stat1['link']:
print('success')
我认为您认为排序是相关的。 您现有的解决方案会将s1中的每个值与s2中的每个值进行比较。
您可能想使用zip
将两个序列结合在一起。 如果您希望序列具有不同的长度,请改用itertools.zip_longest
。
例如:
def compare_same_lengths(s1, s2):
for i1, i2 in zip(s1, s2):
if i1['link'] < i2['link']:
return -1
elif i1['link'] > i2['link']:
return 1
return 0
编辑:
根据您的评论:
如果列表中的任何一个值大于另一个列表的所有其他值,则具有较大值的列表将被宣布为赢家。
您应该使用max
,然后比较两个最大值:
m1 = max(s1, key=operator.itemgetter('link'))
m2 = max(s2, key=operator.itemgetter('link'))
if m1['link'] > m2['link']:
return 1
elif m2['link'] < m1['link']:
return -1
else:
return 0
如果您只想查看哪个列表具有最大数目,可以使用内置的max函数 :
s1=[{'link': 0}, {'link': 0}]
s2=[{'link': 0}, {'link': 1}]
maxes = max([[item["link"] for item in s1], [item["link"] for item in s2]])
if maxes[0] > maxes[1]:
print("S1 is greater than S2")
elif maxes[0] < maxes[1]:
print("S2 is greater than S1")
else:
print("S1 and S2 are equal")
也许您正在尝试突破嵌套循环? 在这种情况下,建议您将代码包装在一个函数中,以便一旦在s2中找到一个大于s1中的元素的元素,就可以简单地使用return
。
无论如何,假设这是严格的定义:
s2大于s1,因为s2中的值之一大于s1
一个线性解决方案是首先获得s1的最小值,然后将其与s2中的元素进行迭代比较。
def is_greater(s1, s2):
s1_min = min(s1, key=lambda x: x['link']) # just `min(s1)` works for python 2.7
for item in s2:
if item['link'] > s1_min['link']:
return True
return False
请注意,如果您拥有[0,1,2,3]的s1值和[0,1,0,0]的s2值,那仍将导致s2> s1,因为s2中的至少一个值大于at s1中的值中的至少一个(我认为作为大于:P的定义没有任何意义)
编辑:在min
函数中添加了关键参数
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.