Сравнение 3 списков в Python

#python #list #compare

#python #Список #Сравнить

Вопрос:

Следующий код сравнивает три списка, motherList fatherlist и sonList , проверяя, представлено ли каждое значение в sonList одном motherList или fatherList один раз.

 def compareList(motherList, fatherList, sonList):
    count = 0
    for x in sonList:
            if x in motherList and x in fatherList:
                    count = 2
            elif x in motherList or x in fatherList:
                    count  = 1
    if count >= 2:
            ans = "Mendelion"
    else:
            ans = "Non-Medelian"

    print"{0} {1} t {2} t {3}".format(motherList, fatherList, sonList, ans)
  

Вывод:

 ['0']        ['0']         ['4']         Non-Mendelion
['2', '6']   ['0']         ['0', '2']    Mendelion
['1']        ['0']         ['1']         Non-Medelian
['-1', '2']  ['-4', '-1']  ['-4', '2']   Mendelion
  

Есть ли более аккуратный способ добиться этого?
Возможно, с помощью рекурсивных или нерекурсивных средств

Комментарии:

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

2. вы имеете в виду один или несколько раз или точно один раз?

3. @Padraic Каннингем, чтобы не сразу

4. наборы колодцев — это, безусловно, правильный путь. Вы должны ознакомиться с документами, в которых есть такие методы, set.symmetric_difference которые могут принимать любую итерацию в качестве аргумента, поэтому вам не придется создавать наборы из всех ваших списков. Использование ^ amp; etc. сначала вы должны преобразовать все в наборы.

5. Этот вопрос, похоже, не по теме, потому что речь идет об улучшении рабочего кода, он может быть лучше подходит для codereview.stackexchange.com

Ответ №1:

Используй наборы, мой друг.

 In [1]: {0, 1, 2} amp; {1, 2, 3} amp; {2, 3, 4}
Out[1]: set([2])
  

Таким образом, ваш код будет выглядеть так:

 if set(motherList) amp; set(fatherlist) amp; set(sonList):
    ans = "Mendelion"
else:
    ans = "Non-Medelian"
  

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

Наборы — это особый тип в python, который дает вам возможность находить пересечения (значения которых находятся в обоих наборах) и различия, что очень удобно использовать во многих ситуациях.

Ответ №2:

То, что вы ищете, — это операция set. Наборы Python уже обеспечивают выполнение условия о том, что все элементы уникальны, и вы можете делать подобные вещи:

 child_set <= (mother_set ^ father_set)
  

который создает набор симметричной разницы между материнским и родительским наборами (все элементы, которые находятся в одном или другом, но не в обоих), а затем проверяет, что каждый элемент в дочернем наборе находится в этом наборе.

Дальнейшее чтение: https://docs.python.org/2/library/stdtypes.html#set-types-set-frozenset

Ответ №3:

Использование понимания списка:

 def compareList(motherList, fatherList, sonList):
    return len([i for i in sonList if i in motherList or i in fatherList])==len(sonList)