繁体   English   中英

如何有效地比较两个词典列表以声明“获胜者”

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM