У меня есть следующие данные в списке словарей. Как я могу эффективно сравнить эти два согласно следующему правилу и сделать вывод, кто победитель?

если какое-либо значение в списке оказывается больше, чем все другие значения другого списка, список с большим значением будет объявлен победителем

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
Zuckerberg 26 Авг 2017 в 04:11

3 ответа

Лучший ответ

Если вы просто хотите увидеть, какой список имеет наибольшее число, вы можете использовать встроенный максимальная функция:

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")
1
illiteratecoder 26 Авг 2017 в 01:35

Я полагаю, что вы считаете последовательность подходящей. Ваше существующее решение будет сравнивать каждое значение в s1 с каждым значением в s2.

Вы, вероятно, хотите использовать zip, чтобы жениться на двух последовательности вместе. Если вы ожидаете, что последовательности имеют разную длину, используйте { {X1}} вместо.

Например:

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
3
aghast 26 Авг 2017 в 03:52

Возможно, вы пытались вырваться из вложенного цикла? В этом случае я предлагаю вам обернуть ваш код в функцию, чтобы вы могли просто использовать return, как только вы найдете элемент в s2 больше, чем один в s1.

Во всяком случае, предполагая, что это строгое определение:

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    

Обратите внимание, что если у вас есть значения s1 [0,1,2,3] и значения s2 [0,1,0,0], это все равно приведет к s2> s1, потому что хотя бы одно из значений в s2 больше, чем при хотя бы одно из значений в s1 (которое, я думаю, на самом деле не имеет смысла как определение больше, чем: P)

РЕДАКТИРОВАТЬ: добавлен ключевой параметр в функцию min

0
Charles V. 26 Авг 2017 в 03:00