#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)