2016-05-10 4 views
0

Задача состоит в том, чтобы проверить, совпадают ли последние 3 цифры из соответствующих элементов из двух списков. Если элементы имеют длину менее 3, он проверяет, являются ли они одинаковым числом.Сравнение элементов из двух списков в Python

Если два списка имеют разную длину, он должен возвращать значение false, и если оба списка имеют длину 0, он должен возвращать значение true.

def corresponding_elements_have_same_end(list1, list2): 

if len(list1) == len(list2): 

    for i in range(0, len(list1)): 

     num1 = str(list1[i]) 
     num2 = str(list2[i]) 

     if len(num1) <= 3 and len(num2) <= 3: 
      return num1 == num2 

     else: 
      return num1[-3:] == num2[-3:] 

else: 
    return False 

Если я запускаю его через это:

print("1.", corresponding_elements_have_same_end([3452, 43600, 10], [3111452, 600, 10])) 
print("2.", corresponding_elements_have_same_end([452, 43600], [52, 600])) 
print("3.", corresponding_elements_have_same_end([32, 43032], [32, 32])) 
print("4.", corresponding_elements_have_same_end([32, 43132, 300], [32, 56132, 3300])) 

Он печатает

  1. Истинной
  2. Ложных
  3. Истинной
  4. Правда

Когда он должен напечатать:

  1. Правда
  2. Ложные
  3. Ложные
  4. Правда
+0

Вы должны рассмотреть возможность использования mod,%, вместо str. num # = list # [i]% 1000. –

ответ

2

Проблема заключается в том что функция всегда проверяет только один элемент из списков и немедленно возвращается независимо от длины. Когда [32, 43032], [32, 32] сравниваются друг с другом, он проверяет это 32 == 32 и сразу же возвращает True. Если вы измените порядок первого списка на [42032, 32], вместо этого вы получите False.

Чтобы исправить проблему, цикл необходимо изменить, чтобы он возвращался только в том случае, если числа не совпадают. Если они это сделают, необходимо проверить следующую пару чисел. Если цикл завершается, вы знаете, что все числа совпадают. Вот пример:

for i in range(0, len(list1)): 
    if str(list1[i])[-3:] != str(list2[i])[-3:]: 
     return False 

return True 

Обратите внимание, что вы могли бы реализовать цикл с zip сделать индексирование ненужным:

for x, y in zip(list1, list2): 
    if str(x)[-3:] != str(y)[-3:]: 
     return False 
0

Может быть, это поток управления вы ищете:

def corresponding_elements_have_same_end(list1, list2): 
    if len(list1) == len(list2): 
     for i in range(len(list1)): 
      num1, num2 = str(list1[i]), str(list2[i]) 
      if len(num1) <= 3 and len(num2) <= 3 and num1 != num2: 
       return False 
      if num1[-3:] != num2[-3:]: 
       return False 
     return True 
    else: 
     return False 
1
def t(m,n): 
    if False in map(lambda x,y:str(x)[-3:]==str(y)[-3:],m,n): 
     return False 
    return True 
Смежные вопросы