2017-08-26 50 views
0

我在词典列表中包含以下数据。如何根据以下规则有效比较这两者,并得出谁是赢家?如何有效比较两个词典列表以声明“获胜者”

if any value in a list turns out to be more than all the other values of the other list , The list with bigger value will be declared the 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') 
+0

你确定你的总体订购是否足够精确? “s2大于s1,因为s2中的其中一个值大于s1中的值” –

+0

如果列表中的任何值比另一个列表中的所有其他值多,则值较大的列表将会被宣布为优胜者 – Zuckerberg

+0

只是要清楚:你所说的是你不需要逐个比较元素。价值最高的名单是胜利者。问题的描述不反映这种说法。你应该更新你的问题的描述。 – Thanassis

回答

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") 
+0

你可能是指“任何”。 –

+0

@AustinHastings我认为你是对的。我试图做一个中立的比较,因为如果S1的一个元素更大,并且S2的一个元素更大,我认为它不应该返回,S1是更大的整体,但我想这是OP想要的。 – illiteratecoder

+0

这与“s2大于s1”不符,因为s2中的一个值大于s1中的值“;它 –

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 

编辑:

基于您的评论:

if any value in a list turns out to be more than all the other values of the other list , The list with bigger value will be declared the winner

你应该使用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 
+0

这是一个正确的*和* pythonic答案。 – Thanassis

+0

这是因为'm1'和'm2'是原来的字典,而不是值,因此'dict'和'dict'的实例之间不支持下面的错误“TypeError:'>' – Zuckerberg

+1

@Zuckerberg。只需使用'm1 ['link']> m2 ['link']'等。 –

0

也许你试图摆脱嵌套循环?在这种情况下,我建议你将代码包装在一个函数中,一旦你发现s2中的元素大于s1中的元素,你就可以简单地使用return

无论如何,假设这是严格定义:

s2 is greater than s1 because one of the values in s2 turns out to be greater than in 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  

需要注意的是,如果你有S1值[0,1,2,3]和S2值[0,1,0,0],将仍然导致S2> S1由于至少一个在S2值比S1的值的至少一个(我认为并没有真正意义上大于的定义:P)更大

编辑:添加关键参数min功能

+0

谢谢,如果s1和s2原来有不同数量的元素,这会工作吗? – Zuckerberg

+0

这个价值最大的清单胜出。这是OP想要的。 – Thanassis

+0

min也不支持字典列表。 – Thanassis