2016-10-30 3 views
0

Ich habe eine lange Liste der Liste, ich möchte überprüfen, ob das letzte Element jeder Liste in der großen Liste, wenn sie gleich sind, wenn sie dann ich erstellen möchte eine neue Liste, die sie in der Reihenfolge hinzufügt und das Element vor dem Element "^" in eine neue Liste von Liste hinzufügt, habe ich beispielsweise folgendes Format (das ist nur ein Beispiel, die Daten können jedes Mal geändert werden, damit der Code sollte generlized werden):Überprüfung der Ähnlichkeit des letzten Elements in einer Liste der Liste Python

[[ " a", "b" , "^", "xxx"] 
[ " c", "d", "e" , "^", "xxx"] 
[ " a", "h" , "^", "nnn"] 
[ " c", "d", "s" , "^", "nnn"]] 

ich zurückkehren wollen:

list1 = [ "xxx", "nnn"] 

in Index entspricht, die erstellten Liste der Liste:

list1= [ [b , e] , [ h, s] ] 

die Namen kurz vor dem Punkt „^“ zu nehmen und das Hinzufügen alles auf den Index in list1 entspricht, weiß ich nicht, wie die Logik, aber meinen Versuch zu tun:

def patterns(file_of_context): 
     ### the original list of list 
    list_of_context= context_file(file_of_context) 
    for a in list_of_context: 
     for b in a: 
      if a[-1]== 
+0

Warum ist '' nnn'' im Ergebnis? Es gibt nur eine davon in der Eingabe (es gibt '' nnn'' obwohl). – TigerhawkT3

+0

Sollten ''xxx'' &'' xxx'' (und '' nnn'' & ''nnn'') gleich sein oder nicht? – niemmi

+0

@niemmi, nein sie sollten diff sein – Lelo

Antwort

0

können Sie OrderedDict verwenden, wo Schlüssel das letzte Element aus verschachtelten Liste und Wert ist list die Elemente enthält, bevor '^':

from collections import OrderedDict 

l = [ 
    [" a", "b", "^", "xxx"], 
    [" c", "d", "e", "^", "xxx"], 
    [" a", "h", "^", "nnn"], 
    [" c", "d", "s", "^", "nnn"] 
] 

res = OrderedDict() 
for x in l: 
    try: 
     index = x.index('^') 
     if index > 0: 
      res.setdefault(x[-1], []).append(x[index - 1]) 
    except ValueError: 
     pass 

print(res.keys()) 
print(res.values()) 

Ausgabe:

['xxx', 'nnn'] 
[['b', 'e'], ['h', 's']] 
0

Der gewünschte Ausgang kann mit groupby von itertools und reduce von functools erreicht werden:

from functools import reduce 
from itertools import groupby 

list_of_lists = [[' a', 'b', '^', 'xxx'], 
[' c', 'd', 'e', '^', 'xxx'], 
[' a', 'h', '^', 'nnn'], 
[' c', 'd', 's', '^', 'nnn']] 

final_list = [] 

for i in groupby(list_of_lists, key=lambda x: x[-1]): 
    final_list.append(list(reduce(lambda x,y: (x[x.index("^")-1],y[y.index("^")-1]), i[1]))) 


print(list(set(map(lambda x: x[-1], list_of_lists)))) 

print(final_list) 

Ich hoffe, das hilft.

Verwandte Themen