2009-10-07 9 views
17

W Pythonie mogę to wykorzystać, aby sprawdzić, czy element na liście a:Metody równoważne rubinowi "jeśli w liście" w python?

>>> a = range(10) 
>>> 5 in a 
True 
>>> 16 in a 
False 

Jak można to zrobić w Ruby?

+0

Później podobne pytanie nie brzmi w kategoriach Pythonie, z większą liczbą odpowiedzi: https://stackoverflow.com/questions/3343861/how-do-i-check-to-see-if-my-array-includes-an-object –

Odpowiedz

26

Zastosowanie metody include?():

(1..10).include?(5) #=>true 
(1..10).include?(16) #=>false 

EDIT: (1..10) jest Range w Ruby, w przypadku, gdy chcesz tablicy (lista):

(1..10).to_a #=> [1,2,3,4,5,6,7,8,9,10] 
+0

A więc jest to podobne do metod index() zwracających zero (false) lub index (true)? – noomz

+2

Indeks działa tylko w Array, ale nie w Range. ! (1..10) .to_a.index (5) .nil? jest równy (1..10). include? (5). Oczywiście, to drugie jest lepsze. – pierrotlefou

10

zakres ten sposób === , który sprawdza, czy argument jest częścią zakresu.

go używać tak:

(1..10) === 5 #=> true 
(1..10) === 15 #=> false 

lub jak to napisał:

a= (1..10) 
a === 5 #=> true 
a === 16 #=> false 

Musisz być pewny wartości zakresu i wartości testowanej są typu kompatybilnym w przeciwnym razie zostanie zgłoszony wyjątek.

(2.718..3.141) === 3 #=> true 
(23..42) === "foo" # raises exception 
  • Odbywa się to w czasie O (1), jak Zakres # === (wartość) porównuje wartość tylko z zakresem pierwszej klasy # # i ostatni.
  • Jeśli najpierw wywołasz Range # to_a, a następnie Array # include ?, to działa w O (n), jako Range # to_a, musi wypełnić tablicę n elementami, a Array # include? musi ponownie przeszukać elementy n.

Jeśli chcesz zobaczyć różnicę, otwartą IRB i typ:

(1..10**9) === 5   #=> true 
(1..10**9).to_a.include?(5) # wait some time until your computer is out of ram and freezess 
+0

Bardzo dobra odpowiedź! –

+0

Dotyczy to tylko zakresów, OP pytał o listy (i używany zakres tylko jako przykład listy) – truppo

+0

napisał listę list, ale użył zakresu w swoim przykładzie, więc myślę, że chce mieć zasięg. Wydaje się, że w Pythonie nie ma natywnej metody tworzenia zakresu, który nie jest listą. (ale muszę podkreślić, że nie jestem ekspertem od Pythona, więc moje założenie może być błędne) – johannes

Powiązane problemy