我在词典列表中有以下数据。如何根据以下规则有效地比较这两者,并得出胜者是谁?
如果列表中的任何值变得超过所有其他值 在另一个列表中,具有更大值的列表将被声明为 赢家
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')
答案 0 :(得分:3)
我认为你认为测序是相关的。您现有的解决方案会将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
答案 1 :(得分:1)
如果您只想查看哪个列表编号最大,可以使用内置max function:
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")
答案 2 :(得分:0)
也许你试图突破嵌套循环?在这种情况下,我建议你将代码包装在一个函数中,这样一旦在s1中找到s2中大于1的元素,你就可以简单地使用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&gt; s1因为s2中的至少一个值大于s1中的至少一个值(我认为这不是真正有意义的定义大于:P)
编辑:在min
函数