2015-10-30 2 views
0

EDIT: Это упражнение, в котором четко указаны списки и функции. Таким образом, преобразование списков в набор не допускается.Функция записи, которая проверяет, имеют ли списки одни и те же элементы

Мне нужно написать функцию def sameSet(a,b), которая проверяет, имеют ли два списка одинаковые элементы в некотором порядке, игнорируя дубликаты. Например, два списка [1, 4, 9, 16, 9, 7, 4, 9, 11] и [11, 11, 7, 9, 16, 4, 1] будут считаться равными.

Вот что я сделал. Сначала я определил вспомогательную функцию def contained(list1, list2), которая проверяет, содержится ли список 1 в списке 2, увеличивая счетчик всякий раз, когда элемент списка 1 находится в списке 2. Затем, в конце, если счетчик равен длине списка 1, я устанавливаю булева переменная same к True, потому что это означает, что каждый элемент в списке 1 также находится в списке 2.

def main(): 
     list1 = [1, 4, 9, 16, 9, 7, 4, 9, 11, 11] 
     list2 = [11, 11, 7, 9, 16, 4, 1] 

    def sameSet(list1, list2): 
     contained(list1, list2) 
     contained(list2, list1) 


    def contained(list1, list2): 

     same = False 
     count = 0 

     for element in list1: 
      if element in list2: 
       count = count + 1 
      else: 
       count = count 

     if count == len(list1): 
      same = True 

     return same 

    main() 

Я не уверен, что писать для функции sameSet. Я хочу, чтобы он проверял, установлена ​​ли логическая переменная same равной True для обоих включений (т. Е. Если list1 находится в списке2, а если list2 находится в списке1, что означает, что они равны). Но я не знаю, как реализовать это в Python, чтобы программа работала правильно. Любая помощь будет оценена по достоинству.

ответ

1

Я реструктурировать свой код, чтобы сделать его немного более питоновски, и провел несколько тестов ...наряду с некоторыми печатными результатами для быстрой проверки.

Ваша содержащаяся функция также работает с функцией SameSet ниже, но она не так эффективна. Он имеет ненужные переменные и такие ...

def sameSet(list1, list2): 
     if contained(list1, list2) and contained(list2, list1): 
       print("the same!!")  
     else: 
      print("not the same") 


def contained(list1, list2): 

    for element in list1: 
     if element not in list2: 
      return False 

    return True 

def main(): 
    # this prints "the same" 
    sameSet([1, 4, 9, 16, 9, 7, 4, 9, 11, 11], [11, 11, 7, 9, 16, 4, 1]) 
    # this prints "not the same" 
    sameSet([1, 4, 9, 16, 9, 7, 4, 9, 11, 11], [11, 11, 7, 9, 16, 4,12345]) 


if __name__=="__main__": 
    main() 
+0

Что мне следует писать под заголовком? – Kamil

+0

Я сделал рефакторинг для сохранения функции main(), не обязательно иметь main() в скрипте python. – PabTorre

3

Преобразовать два списка наборов и сравнить Множества

>>> list1 = [1, 4, 9, 16, 9, 7, 4, 9, 11] 
>>> list2 = [11, 11, 7, 9, 16, 4, 1] 
>>> set(list1) == set(list2) 
True 
+0

Спасибо за подсказку, но проблема в том, что списки явно (это фактически точка). Я изучаю эту книгу, и наборы еще не упоминались. – Kamil

+0

@Kamil: вы можете обновить свой вопрос тем фактом, что это учебное упражнение для работы со списками без использования наборов. –

1

Учитывая новый редактировать:

Чтобы проверить, является ли список l1 равно (от аспекта аналогичного содержания), чтобы в списке l2 без использования set вы можете использовать удобную встроенную функцию all().

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

В небольшой демонстрации:

l1 = [1, 2, 3, 4] 
l2 = [1, 1, 2, 3, 4, 3, 2] 

print(all(i in l1 for i in l2)) # True 

l2.append(5) # l2 = [1, 1, 2, 3, 4, 3, 2, 5] 
print(all(i in l1 for i in l2)) # False 

Но если вы сделаете ошибку проверки, является ли содержимое меньшего списка l1 находятся в большем списке l2 после l2.append(5) была выполнена, вы будете разочарованы:

print(all(i in l2 for i in l1)) # Prints True :^) 

Чтобы сделать это в функцию --и по существу, повторно изобрести all() колесо - не делая ничего «причудливого», вы можете сделать что-то вроде этого:

def sameSet(a, b): 
    # l1 is the large list, l2 the small list 
    l1, l2 = (a, b) if len(a) > len(b) else (b, a) 
    for val in l1: 
     if val not in l2: 
      return False 
    return True 

Что делает то же самое.

1

ничего не меняя в своем коде я бы просто положить в функции sameset:

if contained(list1,list2)==True and contained(list2,list1)==True: 
     return True 
else: 
     return False 
+0

фактически 'if contains (list1, list2) и содержит (list2, list1):' будет достаточно, так как они являются логическими значениями – rosysnake

0

Используйте Dict и почтовый

def unq(l): 
    return sorted(x for x in dict(zip(l,l))) 

stat = unq(l1) == unq(l2) 

так построить словарь каждого списка и сортировать список ключей, а затем просто сравнить 2 результаты, где стат является логическим (True или False)

Смежные вопросы