def common_elements(list1, list2):
"""
Return a list containing the elements which are in both list1 and list2
>>> common_elements([1,2,3,4,5,6], [3,5,7,9])
[3, 5]
>>> common_elements(['this','this','n','that'],['this','not','that','that'])
['this', 'that']
"""
for element in list1:
if element in list2:
return list(element)
Mam to do tej pory, ale wydaje się, że nie mogę tego uruchomić!
Jakieś pomysły?
Odpowiedzi:
źródło
Możesz także użyć zestawów i uzyskać podobieństwa w jednej linii: odejmij zestaw zawierający różnice od jednego z zestawów.
źródło
Rozwiązania sugerowane przez S.Mark i SilentGhost ogólnie mówią ci, jak należy to zrobić w Pythonie, ale pomyślałem, że możesz również skorzystać na wiedzy, dlaczego twoje rozwiązanie nie działa. Problem polega na tym, że gdy tylko znajdziesz pierwszy wspólny element na dwóch listach, zwracasz tylko ten pojedynczy element. Twoje rozwiązanie można naprawić, tworząc
result
listę i zbierając typowe elementy na tej liście:Jeszcze krótsza wersja wykorzystująca wyrażenia listowe:
Jednak, jak powiedziałem, jest to bardzo nieefektywny sposób zrobienia tego - wbudowane typy zestawów w Pythonie są o wiele bardziej wydajne, ponieważ są implementowane wewnętrznie w C.
źródło
użyj zestawu przecięć, set (lista1) i set (lista2)
Zwróć uwagę, że lista wyników może mieć inną kolejność niż oryginalna lista.
źródło
możesz użyć prostego rozumienia listy:
źródło
Zestaw to kolejny sposób na rozwiązanie tego problemu
źródło
list1 = [1,2,3,4,5,6] list2 = [3,5,7,9]
Wiem, że można to rozwiązać na 3 sposoby.Oczywiście może być więcej.
1-
2-
3-
Trzeci sposób jest najszybszy, ponieważ zestawy są implementowane przy użyciu tabel skrótów.
źródło
Wszystkie poprzednie odpowiedzi służą do znalezienia unikalnych wspólnych elementów, ale nie uwzględniają powtarzających się pozycji na listach. Jeśli chcesz, aby wspólne elementy pojawiały się w tej samej liczbie, w jakiej występują wspólne na listach, możesz użyć następującej jednolinijki:
Ta
or True
część jest konieczna tylko wtedy, gdy oczekujesz, że jakiekolwiek elementy zostaną ocenioneFalse
.źródło
set
niestabilności (czyli utraty kolejności).Porównałem każdą z metod wymienionych w każdej odpowiedzi. W tej chwili używam Pythona 3.6.3 do tej implementacji. Oto kod, którego użyłem:
Jeśli uruchomisz ten kod, zobaczysz, że jeśli używasz listy lub generatora (jeśli iterujesz po generatorze, a nie tylko go używasz. Zrobiłem to, gdy zmusiłem generator do wydrukowania jego długości), uzyskasz prawie taką samą wydajność. Ale jeśli użyjesz zestawu, uzyskasz znacznie lepszą wydajność. Również jeśli użyjesz metody przecięcia, uzyskasz trochę lepszą wydajność. wynik każdej metody w moim komputerze jest wymieniony poniżej:
źródło
to jest moja propozycja, myślę, że jest to łatwiejsze z zestawami niż z pętlą for
źródło
Dlaczego nie używać
list comprehension
?Rozwiązanie pół linii:
źródło
1) Metoda 1 zapisująca list1 jest słownikiem, a następnie iteruje każdy element z listy2
Znajdowanie wspólnych i różnych elementów:
2) Metoda 2 przy użyciu zestawu
źródło
Użyj generatora:
Zaletą jest to, że powróci w stałym czasie (prawie natychmiast), nawet w przypadku korzystania z ogromnych list lub innych ogromnych iteracji.
Na przykład,
Wszystkie inne odpowiedzi tutaj zajmą bardzo dużo czasu z tymi wartościami dla list1 i list2.
Następnie możesz powtórzyć odpowiedź za pomocą
Lub przekonwertuj go na listę z
źródło
for i in common: print(i)
. Generatory to elementy iteracyjne, które są często używane zamiast innych elementów iteracyjnych, takich jak listy.