У меня есть следующие данные в списке словарей. Как я могу эффективно сравнить эти два согласно следующему правилу и сделать вывод, кто победитель?
если какое-либо значение в списке оказывается больше, чем все другие значения другого списка, список с большим значением будет объявлен победителем
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')
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")
Я полагаю, что вы считаете последовательность подходящей. Ваше существующее решение будет сравнивать каждое значение в 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
Возможно, вы пытались вырваться из вложенного цикла? В этом случае я предлагаю вам обернуть ваш код в функцию, чтобы вы могли просто использовать 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
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.