簡體   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