2017-08-26 6 views
0

私は以下のデータを辞書のリストに入れています。次のルールに従って、これらの2つを効果的に比較して、勝者が誰であると結論付けることができますか?辞書の2つのリストを効果的に比較して「勝者」を宣言する方法

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の値の1つがs1より大きいため、s2はs1より大きい。 –

+0

リスト内の値が他のリストの他のすべての値よりも大きい場合、s2はs1より大きい。勝者と宣言してください – 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

あなたはたぶん 'any'を意味します。 –

+0

@AustinHastings私はあなたが正しいと思います。私は中立比較をしようとしていました。なぜなら、S1の1つの要素が大きく、S2の1つの要素が大きかった場合、全体的にS1が大きくなったということを返すべきではないと思ったからです。 – illiteratecoder

+0

これは、 "s2がs1より大きいため、s2がs1より大きいためs2がs1より大きい"と一致しません。それは –

3

関連するシークエンシングを考慮する必要があります。既存のソリューションは、s1のすべての値とs2のすべての値を比較します。

おそらくzipを使用して、2つのシーケンスを結びつけたいと思うでしょう。シーケンスの長さが異なることが予想される場合は、代わりに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を使用して、ちょうど2つの最大値を比較する必要があり

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

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

「dict」と「dict」のインスタンス間で「TypeError: '>'がサポートされていません」 – Zuckerberg

+1

@Zuckerberg「m1」と「m2」は元の辞書であり値ではないからです。 'm1 ['link']> m2 ['link']'などを使用してください。 –

0

おそらく、ネストされたループから脱出しようとしていましたか?その場合は、関数内にコードをラップして、returnを使用して、s1の1より大きいs2の要素を見つけてください。とにかく

、これは厳密な定義であると仮定すると:つの直線溶液が最初S1の最小値を得ることである

s2 is greater than s1 because one of the values in s2 turns out to be greater than in 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の値(私は実際よりも大きいの定義として意味をなさないと思う:P)S1における値の少なくとも1つ以上である

EDIT:min機能に追加されたキー・パラメータ

+0

ありがとう、s1とs2が異なる数の要素を持つことが判明した場合、これは機能しますか? – Zuckerberg

+0

最大の価値を持つこのリストが勝ちます。これはOPが望むものです。 – Thanassis

+0

また、minは辞書のリストでサポートされていません。 – Thanassis

関連する問題