2017-10-04 19 views
2

を使用してリストのリストのリストに参加:Pythonは、私は、このリスト構造持つキー

lst = [[['a', 100],['b', 200],['d', 325]],[['a', 50],['b', 250],['c', 75]]] 

「LST」はサブリストの任意の数(LEN(LST)が2よりも大きくなることができます)を含めることができ

出力として、私はしたい:ここ

output = [['a',100,50],['b',200,250],['c',0,75],['d',325,0]] 

は別の例である:

lst = [[['a', 100],['b', 200],['d', 325]],[['a', 50],['b', 250],['c', 75]], [['a', 22], ['b', 10]]] 

output = [['a', 100, 50, 22],['b', 200, 250, 10], ['c', 0, 75, 0], ['d', 325, 0, 0]] 

どうすればよいですか?

+0

なぜいくつかのアイテムは '['c'、0,75]'のようにゼロを含むべきですか? – RomanPerekhrest

+0

'lst'はいつもその構造を持っていますか? IOW、それは常に(リス​​ト(2つのアイテムリスト)のリストです)? –

+0

@RomanPerekhrest最初のサブリストに 'c'"キー "が含まれていないので、OPはデフォルト値0にしたいので表示されます – Wondercricket

答えて

2

我々はlstで使用されているすべての文字キーのリストを持っていた場合、このタスクは少し簡単になるだろうが、それは簡単ですそれらを抽出するのに十分です。

私の戦略は、サブリストを辞書に変換することです。これにより、各キーに関連付けられた値を簡単に取得することが容易になります(&)。 dict.getメソッドを使用すると、欠落しているキーのデフォルト値を指定できます。

lst = [[['a', 100],['b', 200],['d', 325]],[['a', 50],['b', 250],['c', 75]]] 

# Convert outer sublists to dictionaries 
dicts = [*map(dict, lst)] 

# Get all the keys 
keys = set() 
for d in dicts: 
    keys.update(d.keys()) 

# Get data for each key from each dict, using 0 if a key is missing 
final = [[k] + [d.get(k, 0) for d in dicts] for k in sorted(keys)] 
print(final) 

出力

[['a', 100, 50], ['b', 200, 250], ['c', 0, 75], ['d', 325, 0]] 

我々は

lst = [[['a', 100],['b', 200],['d', 325]],[['a', 50],['b', 250],['c', 75]], [['a', 22], ['b', 10]]] 

を使用した場合、出力は

[['a', 100, 50, 22], ['b', 200, 250, 10], ['c', 0, 75, 0], ['d', 325, 0, 0]] 
です

これをPython 2で実行する場合は、外側のサブリストを辞書に変換するコードを少し変更する必要があります。 Pythonの2 & 3の両方で正しく動作そして、あなただけのPython 2上でそれを実行する必要がある場合になります

dicts = list(map(dict, lst)) 

に変更し、あなたは単にPythonの2リターンでmap以来

dicts = map(dict, lst) 

を行うことができますイテレータではなくリスト。itertools.chain.from_iterable()

+0

素晴らしい答えですが、これはPython 3.5 <ソリューションだと言えるのは良いことかもしれません。 OPはどのバージョンを使用しているのかを明確にしていません – Wondercricket

+0

@Wondercricket SO Pythonコミュニティポリシーは、Python 2が明示的に述べられていない限り、Python 3を想定しています。 ;)しかし私は私の答えにいくつかの関連情報を追加します。 –

+0

私はこのポリシーについて知りませんでした。それは知っておいて良かったです:) – Wondercricket

2

あなたが使用することができdefaultdict

from collections import defaultdict 
import itertools 
d = defaultdict(list) 
lst = [[['a', 100],['b', 200],['d', 325]],[['a', 50],['b', 250],['c', 75]]] 
for a, b in itertools.chain.from_iterable(lst): 
    d[a].append(b) 

new_lst = sorted([list(itertools.chain.from_iterable([[a], [0 for i in range(len(max(d.items(), key=lambda x:len(x[-1])))-len(b))]+b])) for a, b in d.items()]) 

出力:

[['a', 100, 50], ['b', 200, 250], ['c', 0, 75], ['d', 0, 325]] 
+0

thx @ Ajax1234あなたのソリューションは2つのサブリストのリストでうまくいくが、[[[a '、100]、[' b '、200]、[' d '、325] [[''、50]、['b'、250]、['c'、75]]、[['a'、22]、['b':10]]] ['a'、100、50、22]、['b'、200、250、10]、['c'、0、75]、['d'、0、325] 0、75、0]、['d'、325、0、0] – gimba

2

itertools.groupby()機能や内蔵のnext()機能:

import itertools 

lst = [ [['a', 100],['b', 200],['d', 325]],[['a', 50],['b', 250],['c', 75]], [['a', 22], ['b', 10]] ] 
lst_len = len(lst) 
sub_keys = [{k[0] for k in _} for _ in lst] 
result = [[k] + [next(g)[1] if k in sub_keys[i] else 0 for i in range(lst_len)] 
      for k,g in itertools.groupby(sorted(itertools.chain.from_iterable(lst), key=lambda x:x[0]), key=lambda x: x[0])] 

print(result) 

出力:

[['a', 100, 50, 22], ['b', 200, 250, 10], ['c', 0, 75, 0], ['d', 325, 0, 0]] 
+0

@ PM2Ring、より大きなリストに追加されました – RomanPerekhrest

0

これが私の "長手" 方式で、私は何を仕事をしていましたは進んでいました:

lst = [[['a', 100],['b', 200],['d', 325]], 
     [['a', 50],['b', 250],['c', 75]], 
     [['a', 22], ['b', 10]], 
     [['c', 110],['f', 200],['g', 425]], 
     [['a', 50],['f', 250],['h', 75]], 
     [['a', 32], ['b', 10]], ] 
nlist = [] 
store={} 
for n,j in enumerate(lst): 
    for i in j : 
     if i[0] in store : 
      store[i[0]].append(i[1]) 
     else : 
      store[i[0]] = nlist + [i[1]] 
    nlist += [0] 
    for k,v in store.items() : 
     if len(v) < n+1 : 
      store[k] = v + [0] 
print(store) 
result=[] 
for k,v in store.items(): 
    result += [[k] + v] 
print(sorted(result)) 
関連する問題