前提・実現したいこと
数字の要素をキーにして配列から辞書を作りたい。
今配列listsに
lists = ["1","東京","神奈川","千葉","2","群馬","茨城","山梨","3","長野","栃木","4","愛知"]
のような要素が入っている。
このlistsを
dict = {1:("東京","神奈川","千葉"),2:("群馬","茨城","山梨"),3:("長野","栃木"),4:("愛知")}
のような辞書に変換したい。
該当のソースコード
dict = {} for list in lists: if type(list) == int: dict[list] else: dict = list print(dict)
のように書いて実行した。
試したこと
該当のソースコードを実行したこと。
発生している問題・エラーメッセージ
該当のソースコードでは目的のアウトプットが得られない。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/29 14:10

回答6件
0
ベストアンサー
ちょっと泥臭いですが、こんな感じで書けました。
Python
1lists = [1, '東京', '神奈川', '千葉', 2, '群馬', '茨城', '山梨', 3, '長野', '栃木', 4, '愛知'] 2 3dst = {} 4for elem in lists: 5 if isinstance(elem, int): 6 dst[elem] = [] 7 pre_key = elem 8 else: 9 dst[pre_key].append(elem) 10 11print(dst)
実行結果 Wandbox
{1: ['東京', '神奈川', '千葉'], 2: ['群馬', '茨城', '山梨'], 3: ['長野', '栃木'], 4: ['愛知']}
追記
もしキーが『数値』ではなく『数字』なら。Wandbox
Python
1lists = ['1', '東京', '神奈川', '千葉', '2', '群馬', '茨城', '山梨', '3', '長野', '栃木', '4', '愛知'] 2 3dst = {} 4for elem in lists: 5 try: 6 elem = int(elem) 7 dst[elem] = [] 8 pre_key = elem 9 except ValueError: 10 dst[pre_key].append(elem) 11 12print(dst)
投稿2018/03/29 14:05
編集2018/03/29 14:37総合スコア35676
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/29 14:10

退会済みユーザー
2018/03/29 14:21

退会済みユーザー
2018/03/29 14:38

退会済みユーザー
2018/03/29 14:42
2018/03/29 14:45

0
わかりにくさを追求してみました。
https://wandbox.org/permlink/0WKHUDKbRjZAghCL
python
1import re 2 3lists = ['1', '東京', '神奈川', '千葉', '2', '群馬', '茨城', '山梨', '3', '長野', '栃木', '4', '愛知'] 4 5def judge(L): 6 k = L[0] 7 vs = [] 8 for v in L[1:]: 9 if re.fullmatch(r'\d*', v): 10 yield (k, vs) 11 k = v 12 vs = [] 13 else: 14 vs.append(v) 15 yield (k, vs) 16 17dst = dict(judge(lists)) 18 19print(dst)
投稿2018/03/29 19:31
総合スコア8562
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
2 つの方法を書いてみました,
pyhon
1lists = [1,"東京","神奈川","千葉",2,"群馬","茨城","山梨",3,"長野","栃木",4,"愛知"] 2 3dic = {} 4key = None 5for elem in lists: 6 if isinstance(elem, int): 7 key = elem 8 dic[key] = [] 9 else: 10 dic[key].append(elem) 11 12print(dic) 13 14 15key_pos = [[x, pos + 1] for pos, x in enumerate(lists) if isinstance(x, int)] 16keys = [x[0] for x in key_pos] 17poss = [x[1] for x in key_pos] + [len(lists) + 1] 18vals = [lists[poss[idx]:poss[idx + 1] - 1] for idx in range(len(keys))] 19dic = dict(zip(keys, vals)) 20print(dic)
投稿2018/03/29 16:50
総合スコア22328
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
別解です。
数字のリストと、数字に対応する県名のリストをパッキングしました。
python
1import re 2 3japan_pref_infos = [ 4 "1","東京","神奈川","千葉","2","群馬","茨城","山梨","3","長野","栃木","4","愛知" 5] 6 7seq = ' '.join(japan_pref_infos) 8japan_prefs = dict(zip( 9 map(int, re.findall('\d', seq)), 10 map(lambda x: tuple(x.strip().split()), re.split('\d', seq)[1:]) 11)) 12 13print(japan_prefs)
投稿2018/04/09 06:48
総合スコア158
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
lists = [1,"東京","神奈川","千葉",2,"群馬","茨城","山梨",3,"長野","栃木",4,"愛知"] result = {} current_num = None for item in lists: if isinstance(item, int): current_num = item result[current_num] = [] else: result[current_num].append(item) print(result) # => {1: ['東京', '神奈川', '千葉'], 2: ['群馬', '茨城', '山梨'], 3: ['長野', '栃木'], 4: ['愛知']}
投稿2018/03/29 14:14
総合スコア985
0
以下のコードで希望の出力になります。
python
1>>> data = [1,"東京","神奈川","千葉",2,"群馬","茨城","山梨",3,"長野","栃木",4,"愛知"] 2>>> d = dict() 3>>> for elem in data: 4... if type(elem) == int: 5... last_key = elem 6... d[last_key] = list() 7... else: 8... d[last_key].append(elem) 9... 10>>> d 11{1: ['東京', '神奈川', '千葉'], 2: ['群馬', '茨城', '山梨'], 3: ['長野', '栃木'], 4: ['愛知']}
投稿2018/03/29 14:08
総合スコア30939
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。