2016-04-11 3 views
1

ich ähnliche Elemente aus einer Liste zu entfernen, ich versuche, die eine SUB_LIST mit den Elementen Namen, das Datum enthält, und weitere Daten:ältere Elemente aus einer Liste entfernen

basket = [['cheese', '2015/04/16', 'junk'],['apple', '2015/04/15', 'other junk'],['apple', '2015/03/15', 'dessert'],['cheese', '2017/04/16', 'pie'],['banana', '2015/04/16', ''],['cheese', '2017/04/10', '']]

Wenn ein Element Namen (Frucht) erscheint zweimal in der Liste, das Programm sollte das Datum vergleichen und das ältere Element entfernen. Ich verwende datetime, um das zweite Element zu vergleichen und dieser Teil funktioniert. Aber wenn ich durch die Liste iteriere, überspringt es 'banana'. Und das sollte der letzte hinzuzufügende Artikel sein.

ich diese Methode versucht haben:

def date_convert(date): 
    """Takes a date string in the form YYYY/MM/DD and converts it to a 
     date object for comparisons.""" 

    # Split date string by ".", " ", "/", or "-" to handle a wider range 
    # of possible inputs. 
    date = re.split('[. /\-]', date) 

    # Strip month of "0" because datetime does not accept that as valid 
    # input. 
    if(date[1][0] == '0'): 
     date[1] = date[1].strip('0') 

    return datetime.date(int(date[0]), int(date[1]), int(date[2]))   




basket = [['cheese', '2015/04/16'],['apple', '2015/04/15'],['apple', '2015/03/15'],['cheese', '2017/04/16'],['banana', '2015/04/16'],['cheese', '2017/04/10']] 

new_basket = [] 

for food in basket: 
    basket.remove(food) 
    for food2 in basket: 
     if food[0].upper() == food2[0].upper(): 
      basket.remove(food2) 

      if date_convert(food[1]) > date_convert(food2[1]): 
       pass 
      else: 
       food = food2 
    else: new_basket.append(food) 

print str(new_basket) 

und erhalten diesen Ausdruck: [['cheese', '2017/04/16', 'pie'], ['apple', '2015/04/15', 'other junk']]

Nach dem Debugger erreicht er nie Banane in der for-Schleife.

+0

Ist die Reihenfolge in der Ausgabeliste wichtig? Vielen Dank. – alecxe

+0

Für die Methode? Möglicherweise. Aber überhaupt nicht für die gewünschte Ausgabe. –

Antwort

1

Hier ist eine Option. Gruppierung nach den ersten Elementen der inneren Teillisten mit defaultdict. max() Verwendung das maximale Datum mit einer benutzerdefinierten key Funktion zu finden, die die Datumszeichenfolgen als Isttermine vergleichen würden helfen:

from collections import defaultdict 
from datetime import datetime 

basket = [['cheese', '2015/04/16', 'junk'],['apple', '2015/04/15', 'other junk'],['apple', '2015/03/15', 'dessert'],['cheese', '2017/04/16', 'pie'],['banana', '2015/04/16', ''],['cheese', '2017/04/10', '']] 

d = defaultdict(list) 
for item in basket: 
    d[item[0]].append(item[1:]) 

print([[key, max(values, key=lambda x: datetime.strptime(x[0], "%Y/%m/%d"))] for key, values in d.items()]) 

Drucke:

[['apple', ['2015/04/15', 'other junk']], ['banana', ['2015/04/16', '']], ['cheese', ['2017/04/16', 'pie']]] 

Beachten Sie, dass die Reihenfolge, in diesem Fall verlieren würden .

+0

Danke, das ist genau das, was ich brauchte, aber es gibt ein kleines Problem. Jede Unterliste hat nach dem Datum zusätzliche Einträge (die Frage wurde aktualisiert). Ich kann diese Art nicht mit einschließen. –

+0

@PythonCheese aktualisiert, überprüfen Sie es. – alecxe

+0

Danke für die Hilfe. –