2015-12-06 11 views
11

Chcę sprawdzić, czy lista ma określoną sekwencję elementów. Posortowałem listę zawierającą 7 elementów, teraz chcę sprawdzić, czy pierwsze 4 są takie same, a ostatnie 3 są takie same.Sprawdzanie listy sekwencji

za to, co chcemy osiągnąć, aby mogło być prawdziwe lista będzie tak:

list = ['1','1','1','1','2','2','2'] 

Mam nadzieję, że to sprawia, że ​​to, co chcę osiągnąć wyraźniejszy.

+0

'jeśli len (set (LST [: 3])) == 1 i len (set (LST [3:])) == 1:' –

+0

Możliwy duplikat http: // stackoverflow .pl/pytania/3787908/python-określ-jeśli-wszystkie-pozycje-na-liście-są-tego-samego przedmiotu – SIslam

+0

Możliwy duplikat [H czy podzielisz listę na porcje o równej wielkości w Pythonie?] (http://stackoverflow.com/questions/312443/how-do-you-split-a-list-into-evenly-sized-chunks-in-python) –

Odpowiedz

8

Możesz wyciąć listę. Podjąć pierwsze cztery elementy:

>>> L = ['1','1','1','1','2','2','2'] 
>>> L[:4] 
['1', '1', '1', '1'] 

a ostatnie trzy:

>>> L[-3:] 
['2', '2', '2'] 

set nie pozwala duplikaty. Dlatego:

>>> set(L[:4]) 
{1} 

Oznacza to, że jeśli długość tego zestawu wynosi 1, wszystkie elementy na pokrojonej liście są takie same.

Wyrażając to wszystko razem:

>>> len(set(L[:4])) == 1 and len(set(L[-3:])) == 1 
True 

pokazuje, że warunek ten jest spełniony.

+0

Yap dokładnie co @ Hugh Bothwell skomentował w pytaniu. – SIslam

1

Na podstawie dodatkowych informacji dotyczących kwestii, to może rozwiązać problem:

def check_group_equal(inputList): 
    ref = inputList[0] 
    for e in inputList[1:]: 
     if e != ref: 
      return False 
    return True 

list = some_random_list(length=7) 

# Check first group 
check_group_equal(list[0:3]) 

# Check second group 
check_group_equal(list[4:7]) 
+1

Ostatnia wartość bardzo pomaga, więc wielkie dzięki! Jednak nie sądzę, że wyrażenie osiągnie to, co chcę. Edytowałem post, aby spróbować wyjaśnić, co chcę lepiej sprawdzić. – Frazer224

+0

to nigdy nie będzie prawda, lista o długości 3 jest zawsze inna niż lista o długości 2 lat. – Netwave

+0

Drodzy downvoter, proszę zauważyć, że moja pierwsza odpowiedź została przekierowana do wersji pierwszego pytania. Po zobaczeniu dodatkowych informacji w edycji, ** odpowiednio dostosowałem swoją odpowiedź **. Proszę przemyśleć, co zrobiliście – SebasSBM

1

Jeśli można przekształcić swoje listy do łańcucha, re zrobi:

re.match(r'^(.)\1{3}(.)\2{2}$', ''.join(['1','1','1','1','2','2','2'])) 
2

Jeśli chcesz sprawdzić, czy lista zawiera 3 elementy jednego elementu i 4 pozycji innej, można pominąć sortowania za pomocą collections.Counter:

content = Counter(['1', '2', '2', '1', '1', '2', '1']).most_common() 
print(content) # => [('1', 4), ('2', 3)] 

if len(content) == 2 and content[0][1] == 4 and content[1][1] == 3 or 
    len(content) == 1 and content[0][1] == 7: 
    pass # Your list have desired structure 
Powiązane problemy