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

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

ただいまの
回答率

90.48%

  • Python

    8573questions

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

辞書型をリスト型に順番に変換する方法

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,033

terak31

score 6

ほそく

        #list リスト型の場合
        if isinstance(variable_field,list) == True:
            print("csv-outpiut:list ",type(variable_field))
            writer.writerow(fixed_field + variable_field) # 固定項目+可変項目

        #dict 辞書型の場合
        elif isinstance(variable_field,dict) == True:
            print("csv-outpiut:dict ",type(variable_field))

            lst = []
            for e in variable_field.items():
               lst.extend(e)

            print("lst :",lst)                                          
            writer.writerow(fixed_field + lst) # 固定項目+可変項目

        #タプル型の場合
        elif isinstance(variable_field,tuple) == True:
            print("csv-outpiut:tuple ",type(variable_field))
            listed_var = list(variable_field)            
            writer.writerow(fixed_field + listed_var) # 固定項目+可変項目
        else:
            print("csv-outpiut:other ------------------e-r-r-o-r-e-r-r-o-r-e-r-",type(variable_field))

おせわになります。初心者です。
辞書型データを並び順は同じで配列型リスト型に変換するには
どのように指定すべきでしょうか?

例えば

variable_field {'name': 'ああ', 'balance': 0.0, 'age': '23'}


の時に以下のようなリスト型に変換したいのです。

'name','ああ', 'balance',0.0, 'age','23'

ためしたこと
listed_var = list(variable_field)  

よろしくお願いします

参考サイト
http://ututel.blog121.fc2.com/blog-entry-45.html

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

pythonの言語仕様では、辞書のキー順は任意です。書いた通りの順番で出てくるとは限りません。
(CPython3.6の実装だと維持されるようになっているらしいですが、たまたまそういう実装というだけでこれに頼るべきではないでしょうし、CPython3.6以前の環境では使えません)

なので、困りましたね。とりあえず、順番を不問にして良いのなら、やることはできます。

d = {'name': 'ああ', 'balance': 0.0, 'age': '23'}
lst = []
for e in d.items():
    lst.extend(e)

これをリスト内包表記にしていないのには理由があります。リスト内包表記は、実は一回の反復で複数の要素を足すような処理は(まともには)書けないのです。なので、けっきょくこうするのが一番の近道です。

順番を気にするのであれば、OrderedDictという手があります。

8.3. collections — コンテナデータ型 — Python 3.6.5 ドキュメント

あるいは、先にどんなキーが来るかわかっているのなら、最初からキーでループした方が得策かもしれません。これならキーの順番にできます。

d = {'name': 'ああ', 'balance': 0.0, 'age': '23'}
lst = []
for k in ['name', 'balance', 'age']:
    lst.append(k)
    lst.append(d[k])

 ところで

質問者さんの過去の質問で、解決済みになっていないものがけっこうあるようです。良い回答が得られて問題が解決したのであれば、解決済みにすることをおすすめします。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/15 00:09

    ありがとうございます。今試してみます。キーは毎回異なってしまうんですよ。残念ですね

    キャンセル

  • 2018/06/15 00:17

    最初から順番の概念がないものを「順番通りに」扱うことはできないですからねー。
    あと、これJSONから取ったデータだったりします? もしそうなら、そもそもJSON自体、キーと値のペアの順番はないですから基本的に無理ですね。

    キャンセル

  • 2018/06/15 00:22

    本当にありがとうございます。2点質問があります。
    1 同じくタプル型をリストに変換する場合は
    list(variable_field) でよいのでしょうか?

    2辞書型の順番はランダムなのは調べてわかりましが、このランダム性はcsvのカラム上は毎回変わらず一定と考えてよろしいですか。
    つまり順番はごちゃまぜだけど、ごちゃごちゃの順番は何回csvを作成しても変わらない。

    キャンセル

  • 2018/06/15 00:24

    私はhayataka2049さんに出会わなければ本気でプログラムやめてました。ありがとう。つばめちゃん💕

    キャンセル

  • 2018/06/15 00:29

    >1
    variable_fieldがタプル型オブジェクトを参照しているならそれで良いです

    >2
    インタプリタの実装に依存します。基本的には考えない方がよろしいです。ややこしい話なので、私も説明する自信がありませんが、よくまとまっている記事があるので紹介しておきます。
    http://www.freia.jp/taka/blog/python3-hash-randomie/index.html
    「まあできちゃうよね」という現実もありますが、あくまでも同一の辞書オブジェクトに対しての話。同じキーを持つ違う辞書オブジェクトでも同じ順番になるとは限らないとか、プログラム走らせるたびに変わり得るとかだと、使い物にはならないでしょう。

    キャンセル

  • 2018/06/15 00:30

    ありゃ、なんかすみません

    キャンセル

  • 2018/06/15 00:35

    1
    参照するオブジェクト型を分けてチェックしてみました。csvを出力するのが目的のため。気になる点があれば是非ご教示ください。

    2
    csvの項目が変わらなければいいかなと思っています。

    キャンセル

  • 2018/06/15 00:35

    補足としてソースを冒頭にかきました

    キャンセル

  • 2018/06/15 00:40

    1.とりあえず==Trueは要らないですね

    2.そしたら、回答の2つ目のコードのやり方で、キーのリストをsorted(d.keys())とかにすれば、とりあえず同じ辞書が来たら同じ順番(アルファベット順)に並びはするんじゃないですかね。

    キャンセル

  • 2018/06/15 00:43

    横から失礼します。
    辞書型で順番固定したい場合は、OrderedDictというものがあります。
    どうしても順序固定したい場合は、ご一考いただければと。

    https://docs.python.jp/3/library/collections.html#collections.OrderedDict

    キャンセル

  • 2018/06/15 00:46

    そう思って一応回答にも載せてたんですが、そもそも最初から辞書型でinputされてきたものをOrderdDictでどうこうしようとか考えてもあんまり意味ないんじゃという気が個人的にはするのです

    キャンセル

  • 2018/06/15 00:48 編集

    左様でございましたか。
    ご回答の見落としでございました。
    横槍、申し訳ありません。

    キャンセル

  • 2018/06/15 00:49

    たしかに。ありがとうございます。yuusukoさんもありがと

    キャンセル

  • 2018/06/15 00:52 編集

    >yuusukoさん
    構いませんよ。というか、私が書いていたのは「OrderdDict」についてでした(上のコメントでもそう書いているので、素で覚え間違えてた)
    はずかし・・・とりあえず回答の方は修正しました

    キャンセル

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

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python

    8573questions

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