質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

6回答

6521閲覧

数字の要素をキーにして配列から辞書を作りたい

退会済みユーザー

退会済みユーザー

総合スコア0

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/03/29 13:55

編集2018/03/29 14:39

前提・実現したいこと

数字の要素をキーにして配列から辞書を作りたい。
今配列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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wakame

2018/03/29 14:08

リスト内文字列であれば""か''でくくってもらえませんか。これソースコードからのコピペなら変数未定義でエラーでそうですけど。
hayataka2049

2018/03/29 14:10

とりあえず、listという変数名は組み込みのlistクラスを上書きしちゃうので、使ってはいけませんとアドバイスしておきます
guest

回答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
LouiS0616

総合スコア35676

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wakame

2018/03/29 14:10

Wandbox、コードと実行結果、かつそれらを動かす環境を提示できるのですねすごい。
LouiS0616

2018/03/29 14:14

いつの間にか自分の中での定型がこうなってたのです。 動作チェックも忘れずにすみますし。
退会済みユーザー

退会済みユーザー

2018/03/29 14:21

回答をくださりありがとうございます。提示してくださったコードを実行したのですが、UnboundLocalError: local variable 'pre_key' referenced before assignment とエラーが出てしまいます。else文の中のdst[pre_key].append(elem) のpre_keyにアクセスができないようです。pre_keyの初期値は何に設定しておけば良いでしょうか?
LouiS0616

2018/03/29 14:26

listsの最初の要素は数値ではないのですか? あるいは、数値ではなく『数字』なのでしょうか。
退会済みユーザー

退会済みユーザー

2018/03/29 14:38

listsの最初の要素は文字列になっていました!この場合だとコードに影響がありますか?
LouiS0616

2018/03/29 14:40

文字列というと、数値を表す文字列ですか?地名を表す文字列ですか? 前者の場合は追記したコードで動作します。 後者の場合は、minmiさんがどのように扱いたいかに依ります。
退会済みユーザー

退会済みユーザー

2018/03/29 14:42

はい、数値を表す文字列です。目的のアウトプットが出ました!ありがとうございます。また、intとstrを辞書のキーにするときの扱いの違いもわかり勉強になりました。
hayataka2049

2018/03/29 14:45

敢えてコードにケチ付けると、isnumericでも使って判定すれば・・・何もtry-exceptなんかしなくても・・・>LouiS0616さん
LouiS0616

2018/03/29 14:48

@hayataka2049 さん 確かに自然数しか扱わない場合はisnumericで充分ですね。ご指摘ありがとうございます。
guest

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

mkgrei

総合スコア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

katoy

総合スコア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

arch_

総合スコア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

yukkeorg

総合スコア985

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yukkeorg

2018/03/29 14:16

おおっと...すでに回答者がお二方いらっしゃいましたね。
guest

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

hayataka2049

総合スコア30939

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問