如何有效地比较两个词典列表来宣布一个"胜利者"

时间:2017-08-26 01:11:51

标签: python python-3.x dictionary

我在词典列表中有以下数据。如何根据以下规则有效地比较这两者,并得出胜者是谁?

  

如果列表中的任何值变得超过所有其他值   在另一个列表中,具有更大值的列表将被声明为   赢家

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')

3 个答案:

答案 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函数

中添加了关键参数