2016-10-30 5 views
0

私は長いリストのリストを持っています、もしそれらが等しいならば、大きなリストの中の各リストの最後のアイテムが、新しいリストを順番に追加し、アイテム "^"の前のアイテムを新しいリストリストに追加します。たとえば、次のフォーマットがあります(これは単なる例です。 )generlizedさ:リストのリストの最後のアイテムの類似性をチェックする

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

私は返すようにしたい:

インデックスに対応する
list1 = [ "xxx", "nnn"] 

リストの作成したリストに:

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

は、右の「^」の項目の前に名前を取って、リスト1にインデックスに対応するすべてのものを追加し、私はロジックを実行する方法を知っているが、私の裁判はありません。

キーは、ネストされたリストと値から最後の要素がされているところ
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

なぜ結果に ''nnn''がありますか?入力にはそれらのうちの1つだけがあります(ただし、 '' nnn ''があります)。 – TigerhawkT3

+0

'' xxx ''と' 'xxx' '(そして' 'nnn''と '' nnn '')は同じものとみなされますか? – niemmi

+0

@niemmi、彼らはdiffでなければなりません – Lelo

答えて

0

あなたはOrderedDictを使用することができますアイテムを含むlist'^'前:

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()) 

出力:

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

所望の出力がfunctoolsからitertoolsからgroupbyreduceで達成することができます:

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) 

私はこのことができます願っています。

関連する問題