2017-02-15 5 views
0

私はこのようになります辞書のリストを持っている:私は必要なのタプルのリストを作成するために私のリストに反復することであるPythonは

list=[{u'hello':['001', 3], u'word':['003', 1], u'boy':['002', 2]}, 
    {u'dad':['007', 3], u'mom':['005', 3], u'honey':['002', 2]} ] 

このように:

new_list=[('hello','001', 3), ('word','003',1), ('boy','002', 2) 
      ('dad','007',3), ('mom', '005', 3), ('honey','002',2)] 

注意! 0の数字( '001'、003 '...など)は文字列として考慮する必要があります。

私を助けることができる人はいますか?

+1

キーが両方のディクショナリに存在する場合はどうなりますか? –

+1

SOはコード作成サービスではありません。この問題を自分で解決するには、少なくとも最小限の努力をしてください。 – DeepSpace

+0

鍵が2回発生した場合は、鍵を2回発言する必要があります。 – CosimoCD

答えて

3

あなたはそのために、リストの内包表記を使用することができます。ここでは

new_list = [(key,)+tuple(val) for dic in list for key,val in dic.items()] 

我々はすべてのdic tonaries in listを反復処理します。すべてのdicについては、.items()を繰り返して、keyvalueを抽出し、(key,)+valでタプルを作成します。

値が文字列であるかどうかは関係ありません。リストの理解度は単に参照をコピーするので、元の要素がFooの場合、それらはFooのままです。

最後に、辞書は順序がないので、順序は不定であることに注意してください。しかし、辞書d1が辞書d2の前に出現する場合、最初の要素のすべての要素は、後者のタプルの前にリストに配置されます。しかし、個々の辞書のタプルの順序は決まっていません。

+0

@ウィルム・ヴァン・オンセム、コードはうまくいきます。本当にありがとう! – CosimoCD

2

一覧-理解ワンライナーのPython 3.5+用:

my_list=[{u'hello':['001', 3], u'word':['003', 1], u'boy':['002', 2]}, 
     {u'dad':['007', 3], u'mom':['005', 3], u'honey':['002', 2]}] 

result = [(k, *v) for f in my_list for k,v in f.items()] 

# [('word', '003', 1), ('hello', '001', 3), ('boy', '002', 2), ('dad', '007', 3), ('honey', '002', 2), ('mom', '005', 3)] 

PS:それはpythonのビルトインあるので、変数名listを使用しないでください。

Pythonの古いバージョンの場合は、@WillemVanOnsemによる、星印式を使用しない答え(*v)を参照してください。

+1

これらの 'u'文字列は、OPがPython 2を使用していることを示していますので、'(k、* v) 'の星の展開は機能しません。 –

+1

あなたがPython 3.5+を持っているなら、これはいいです。 –

+0

が更新されました。それを指摘してくれてありがとう。 –

0

辞書に自分の価値観は、常に長さ2のリストである場合は、あなたができる:

あなたがいることを、出力あなたの例が示すようにASCIIとして再コード化された気にしないと仮定すると
new_list = [ (key, value[0], value[1]) for dict in list for key, value in dict.iteritems() ] 
+1

あなたは 'for'ステートメントを交換する必要があります... –

+0

うん、あなたは正しい! @WillemVanOnsem! –

+0

編集ありがとう! –

0

あなたは秩序を維持し、あなたは彼らがかつて上場辞書の労働組合間で、このコード例が動作するはずよりも多く表示された場合のアイテムをマージすることを気にしない:私は最初のキーを連結する方法

>>> input_list = [ 
... {u'hello': ['001', 3], u'word': ['003', 1], u'boy': ['002', 2]}, 
... {u'dad': ['007', 3], u'mom': ['005', 3], u'honey': ['002', 2]}] 
... 
>>> temporary_dict = {} 
>>> output_list = [] 
>>> for dictionary in input_list: 
...  for key in dictionary.keys(): 
...   if key in temporary_dict: 
...    temporary_dict[key] += dictionary[key] 
...   else: 
...    temporary_dict[key] = dictionary[key] 
... 
>>> for key in temporary_dict.keys(): 
...  output_list.append(tuple([key] + temporary_dict[key])) 
... 
>>> print(output_list) 
[(u'dad', '007', 3), (u'boy', '002', 2), (u'word', '003', 1), 
(u'honey', '002', 2), (u'mom', '005', 3), (u'hello', '001', 3)] 

注意をリストされたすべての辞書からtemporary_dictで辞書を繰り返し、辞書keyとそのキーの値(temporary_dict[key])の連結リストを作成し、それらを新しい出力リストに追加します。

私の前提が間違っている場合は教えてください。

2
list=[{u'hello':['001', 3], u'word':['003', 1], u'boy':['002', 2]}, 
    {u'dad':['007', 3], u'mom':['005', 3], u'honey':['002', 2]} ] 

>>> [map(lambda (k,v): (k,)+tuple(v), dictionary.iteritems()) for dictionary in list] 

[[(u'boy', '002', 2), (u'word', '003', 1), (u'hello', '001', 3)], [(u'dad', '007', 3), (u'honey', '002', 2), (
u'mom', '005', 3)]] 
>>>