Stwierdziłem, że jest powiązane pytanie, jak sprawdzić, czy na liście znajduje się co najmniej jeden element:
Jak sprawdzić, czy jeden z poniższych elementów znajduje się na liście?
Ale jaki jest najlepszy i pytoniczny sposób sprawdzenia, czy wszystkie elementy znajdują się na liście?
Przeszukując dokumenty znalazłem to rozwiązanie:
>>> l = ['a', 'b', 'c']
>>> set(['a', 'b']) <= set(l)
True
>>> set(['a', 'x']) <= set(l)
False
Inne rozwiązanie byłoby takie:
>>> l = ['a', 'b', 'c']
>>> all(x in l for x in ['a', 'b'])
True
>>> all(x in l for x in ['a', 'x'])
False
Ale tutaj musisz pisać więcej.
Czy są jakieś inne rozwiązania?
set(smaller) <= set(larger)
?Odpowiedzi:
Operatory takie jak
<=
w Pythonie generalnie nie są nadpisywane, aby oznaczać coś znacznie innego niż „mniejsze lub równe”. To niezwykłe, że standardowa biblioteka to robi - dla mnie pachnie jak starsze API.Użyj odpowiednika i sposób bardziej wyraźnie nazwane
set.issubset
. Zauważ, że nie musisz konwertować argumentu na zbiór; w razie potrzeby zrobi to za Ciebie.źródło
<=
iissubset
znaczenie tego samego. Dlaczego tego nie lubisz?<=
oznacza zbiór bez szukania go w dokumentacji lub posiadania wcześniejszej wiedzy o tym, co to znaczy w teorii mnogości, podczas gdy każdy wie, co toissubset
znaczy automatycznie.Prawdopodobnie użyłbym
set
w następujący sposób:lub odwrotnie:
Uważam, że jest trochę bardziej czytelny, ale może być przesadzony. Zestawy są szczególnie przydatne do obliczania sumy / przecięć / różnic między kolekcjami, ale może nie być najlepszą opcją w tej sytuacji ...
źródło
MySet.issubset(MyOtherSet)
iMySet <= MyOtherSet
są takie same.<=
ma znaczenie, jakie ma dla sekwencji: można by się spodziewać, że oznacza „jest podciągiem”, a nie porządkiem leksykograficznym.<=
z sekwencjami również wydaje się dziwne, jakoś ...set(['a','a']).issubset(['a'])
zwracaTrue
.Podoba mi się te dwa, ponieważ wydają się najbardziej logiczne, te drugie są krótsze i prawdopodobnie najszybsze (pokazane tutaj przy użyciu
set
składni literalnej, która została przeniesiona do Pythona 2.7):źródło
Co się stanie, jeśli Twoje listy zawierają takie duplikaty:
Zestawy nie zawierają duplikatów. Tak więc następujący wiersz zwraca True.
Aby liczyć na duplikaty, możesz użyć kodu:
Tak więc następujący wiersz zwraca False.
źródło
To właśnie szukałem w Internecie, ale niestety nie znalazłem go w Internecie, ale podczas eksperymentów z interpretera Pythona.
a jeśli masz dłuuugą listę zmiennych przechowywanych w pliku
sublist variable
źródło
Przykładem tego, jak to zrobić za pomocą wyrażenia lambda, byłoby:
źródło
Nie w przypadku OP, ale - dla każdego, kto chce potwierdzić przecięcie w dyktach i wylądował tutaj z powodu słabego wyszukiwania w Google (np. Ja) - musisz popracować z
dict.items
:Dzieje się tak, ponieważ
dict.items
zwraca krotki par klucz / wartość i podobnie jak każdy obiekt w Pythonie, są one zamiennie porównywalneźródło