2015-01-27 3 views

Antwort

9

Verwendung Liste Scheibenverfahren

>>> l1 = ['apple', 'pear', 'grapes', 'banana'] 
>>> target_ibdex = l1.index('pear') 
>>> target_ibdex 
1 
>>> l1[:target_ibdex+1] 
['apple', 'pear'] 
>>> 

Mit Ausnahmebehandlung wenn das Element nicht in der Liste vorhanden ist.

>>> l1 = ['apple', 'pear', 'grapes', 'banana'] 
>>> target_element = "mango" 
>>> try: 
...  target_index = l1.index(target_element) + 1 
... except ValueError, e: 
...  target_index = None 
... 
>>> l1[:target_index] 
['apple', 'pear', 'grapes', 'banana'] 

wenn das Element in der Liste vorhanden

>>> l1 = ['apple', 'pear', 'grapes', 'banana'] 
>>> target_element = "pear" 
>>> try: 
...  target_index = l1.index(target_element) + 1 
... except ValueError, e: 
...  target_index = None 
... 
>>> l1[:target_index] 
['apple', 'pear'] 
+0

Sie sollten überprüfen, ob das Element ein Teil der Liste ist oder versuchen Sie es. Catch ValueError –

+0

@HubertGrzeskowiak ja, jetzt aktualisiert. –

+0

Anstelle von 'target_index = len (l1)' - können Sie einfach 'target_index = None' verwenden. –

5
l1 = ['apple', 'pear', 'grapes', 'banana'] 
if "pear" in l1: 
    l2 = l1[:l1.index("pear")+1] 
    print l2 

Output:

[ 'Apfel', 'pear']

5

Sie können einen benutzerdefinierten Generator-Funktion bauen, die auf jedem iterable arbeiten, listet nicht nur - obwohl für Ihr Beispiel list.index, Ausnahmebehandlung und Schneiden in Ordnung ist ...

def takewhile_including(iterable, value): 
    for it in iterable: 
     yield it 
     if it == value: 
      return 

l1 = ['apple', 'pear', 'grapes', 'banana'] 
print('Until pear', list(takewhile_including(l1, 'pear'))) 
# Until pear ['apple', 'pear'] 
print('Until blah', list(takewhile_including(l1, 'blah'))) 
# Until blah ['apple', 'pear', 'grapes', 'banana'] 
0
l1 = ['apple', 'pear', 'grapes', 'banana'] 
l1 = [x for x in l1[0:l1.index(<target>)+1]] 

es Abstracting heraus eine Funktion, für Modularität und Wiederverwendung wäre ideal.

>>> li 
['apple', 'orange', 'pear', 'tomato'] 
>>> 
>>> def slice_and_dice(fruit, fruits): 
...  
     if fruit in fruits: 
...  slice = [fr for fr in l1[:fruits.index(fruit)+1]] 
...  return slice 
... 
>>> slice_and_dice('pear', li) 
['apple', 'orange', 'pear'] 
+1

Ihre [fr für fr in l1 [: fruits.index (obst) +1]] kann kürzer geschrieben werden als l1 [: fruits.index (fruit) +1]. Das Listenverständnis hat hier keinen Nutzen. –

+0

Es könnte auch kürzer sein, wenn ich die Bedingung darin eingeschlossen habe, ist der Vorteil, den ich für Listenerläuterungen habe, leichter zu lesen, nicht für alle gleich. – AutonomouSystem

+0

Wie ist unnötiger zusätzlicher Code leichter zu lesen? –

2

Nun, ich war interessiert, wie schnell jede Lösung ist. Hier ist der Code und Schätzungen:

setup = """ 
from itertools import takewhile, dropwhile 

def dropwhile_v1(iterable, sentinel): 
    return reversed(list(dropwhile(lambda x: x != sentinel, reversed(iterable)))) 

def dropwhile_v2(iterable, sentinel): 
    return list(dropwhile(lambda x: x != sentinel, iterable[::-1]))[::-1] 


def dropwhile_jon(iterable, sentinel): 
    for item in iterable: 
     yield item 
     if item == sentinel: 
      return 

def dropwhile_vivek(iterable, sentinel): 
    try: 
     target_index = iterable.index(sentinel) + 1 
    except ValueError: 
     target_index = None 

    return iterable[:target_index] 

def dropwhile_autonomou(iterable, sentinel): 
    if sentinel in iterable: 
     slice = [fr for fr in iterable[:fruits.index(sentinel)+1]] 
     return slice 


from random import uniform 
seq = [uniform(1,100) for _ in range(100)] 

def test(callable): 
    sentinel = uniform(1,100) 
    callable(seq, sentinel) 
""" 

import timeit 
for method in ['dropwhile_v1', 'dropwhile_v2', 'dropwhile_vivek', 'dropwhile_jon', 'dropwhile_autonomou']: 
    print ('%s: %fs' % (method, timeit.timeit('test(%s)' % method, setup=setup, number=1000000))) 

Ausgang:

dropwhile_v1: 12.979626s 
dropwhile_v2: 13.234087s 
dropwhile_vivek: 3.883617s 
dropwhile_jon: 0.622481s 
dropwhile_autonomou: 2.100633s 
+3

Um 'dropwhile_jon 'richtig zu testen - müssen Sie eine Liste erstellen, damit Sie Äpfel mit Äpfeln vergleichen - ansonsten, der Test initialisiert nur die Generatorfunktion –

+0

Auch Sie haben "Früchte" dort, wo es "iterable" sein sollte, denke ich. –

+1

Ansonsten sollten Sie mit dem gleichen Sentinel für alle Methoden testen, nicht mit zufälligen. –

Verwandte Themen