2017-07-02 9 views
0

事前定義リストから既存の辞書にキー値を追加しようとしています。以下は一例です。また、Player_idのようにする方法はあり複数のリストを一意のキーで使用して辞書を作成する方法

a = ['player_id', 'player_name','time_played', 'player_pokemon', 'gyms_visited'] 
b = [2, 'teri', 22.2, {}, []] 

:私は私の選手たちにリストabを追加しようとしている

# I created players dictionary : 
players = {'gyms_visited': [], 
'player_id': [4], 
'player_name': 'cynthia', 
'player_pokemon': {}, 
'time_played': 30.9} 

は、私が上記で作成したことをディクショナリ値(4、2)選手の辞書(これは私が達成しようとしているものです)をキーとして:

{4: {'gyms_visited': [], 
    'player_name': 'cynthia', 
    'player_pokemon': {}, 
    'time_played': 30.9}, 
2: {'player_name':'teri', 
    'time_played':22.2, 
    'gyms_visited': [], 
    'player_pokemon':{}} 
+0

あなたの必要性を明確にすることはできますか?それは少し不明です –

+0

私は、{'gyms_visited':[]、 'player_id':[4]、 'player_name': 'cynthia'、 'player_pokemon':{}に割り当てられた変数を持つ、 、 'time_played':30.9} –

+0

リストから別の辞書を追加しようとしています[a]、[b] –

答えて

0

必要なのは、次のとおりです。

あなたはこのような所望の出力タイプにごすでに行わ辞書を変更する必要があります

まず:以下

# to change already existing dict 
players = {players['player_id']:{key:value for key,value in players.items() if key != 'player_id'}} 
# make dict from lists a and b 
z = {b[a=='player_id']: {key:value for key,value in zip(a,b) if key !='player_id'}} 
# group both 
players={**players,**z} 

詳細

players = {players['player_id']:{key:value for key,value in players.items() if key != 'player_id'}} 
print(players) 

意志出力:

{4: {'gyms_visited': [], 
    'player_name': 'cynthia', 
    'player_pokemon': {}, 
    'time_played': 30.9}} 

あなた2つのリストabを取って、次のように追加してください:

z = {b[a=='player_id']: {key:value for key,value in zip(a,b) if key !='player_id'}} 
print(z) 

意志出力:

{2: {'player_name': 
    'teri', 'time_played': 22.2, 
    'player_pokemon': {}, 
    'gyms_visited': []}} 

と次のように最後に、あなただけの同じ辞書に入れ:

players={**players,**z} 
print(players) 

出力:

{4: {'gyms_visited': [], 
    'player_name': 'cynthia', 
    'player_pokemon': {}, 
    'time_played': 30.9}, 
2: {'player_name': 'teri', 
    'time_played': 22.2, 
    'player_pokemon': {}, 
    'gyms_visited': []}} 

ことに注意してくださいいくつかの膜を追加したい場合は、これをループで行うことができます。あなたが出力として得る

z = {b[a=='player_id']: {key:value for key,value in zip(a,b) if key !='player_id'}} 
players={**players,**z} 

::前と同じ操作を実行して

a = ['player_id', 'player_name','time_played', 'player_pokemon', 'gyms_visited'] 
b = [6, 'new_Name', 66.6, {}, []] 

:exempleは、これらの新しいリストを検討するために

{4: {'gyms_visited': [], 
    'player_name': 'cynthia', 
    'player_pokemon': {}, 
    'time_played': 30.9}, 
2: {'player_name': 'teri', 
    'time_played': 22.2, 
    'player_pokemon': {}, 
    'gyms_visited': []}, 
6: {'player_name': 'new_Name', 
    'time_played': 66.6, 
    'player_pokemon': {}, 
    'gyms_visited': []}} 

あなたがmerging dicts**dictsについてこれらのリンクを参照することができますより良い理解のために。

また、組み込みジップ方式のlinkもあります。

+0

ありがとうございます!!私は参照リンクをチェックします! –

+0

問題ありません。答えに興味があるかもしれない将来のユーザーのチェックマークをクリックしてニーズに合った場合は、回答を受け入れることを忘れないでください。 –

0
from itertools import izip 
from pprint import pprint 

# Edit your existing dict 
>>> players2 = {players.pop('player_id')[0]: players} 
>>> pprint(players2) 
{4: {'gyms_visited': [], 
    'player_name': 'cynthia', 
    'player_pokemon': {}, 
    'time_played': 30.9}} 

# Add new player info 
>>> players2.update({b[0]: {k: v for k, v in izip(a, b[1:])}}) 
>>> pprint(players2) 
{2: {'gyms_visited': [], 
    'player_name': 'teri', 
    'player_pokemon': {}, 
    'time_played': 22.2}, 
4: {'gyms_visited': [], 
    'player_name': 'cynthia', 
    'player_pokemon': {}, 
    'time_played': 30.9}} 

注:あなたは、いくつかの反復コードで作業しているときはいつでも、それはビルトインitertools packageチェックアウトする価値があります。 izipは、eaxampleの場合、リストの代わりにイテレータを返すことによってzip以上に改善されます。

+0

ありがとうございます! –

+0

お手伝いします。私はユニットテストのためにポケモンの例を使用します;) 左のチェックマークを付けて答えを選択するのを忘れないでください。 – BoltzmannBrain

関連する問題