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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

449閲覧

Python 配列の要素番号順に辞書を並び替えたい

pythongirl

総合スコア2

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2023/05/26 13:56

実現したいこと

配列に入っている要素番号をキーとして
辞書型の要素を並べ替えたいです

前提

Python3.6 で並べ替え用のヘッダーファイルを使用して入力ファイルを並べ替え、出力したいと思っています。

例)
並べ替え用  ["Japan","America","France"]
入力用 {0:{0:"France",1:"japan",3:"America"},1:{0:"fraise",1:"ichigo",2:"strawberry"}}

output = {"0":{0:Japan,1:America,3:France},"1":{0:ichigo,1:strawberry,2:fraise}}

最終的にはcsvにて以下のように出力したいです
Japan,America,Franse
ichigo,strawberry,fraise

該当のソースコード

Python

#!/usr/bin/python # -*- coding: utf-8 -*- array = [] list = {} output = {} array = ["Japan","America","France"] list = {0:{0:"France",1:"japan",3:"America"},1:{0:"fraise",1:"ichigo",2:"strawberry"}} for line, value in enumerate(array): output[line][value] = list[line][value]

試したこと

output[line][value] = list[line][value]
output[line] = list[line]

などを試してみたのですが、エラーになりました。
何か書き方違っているのだと思います。
.keyなどを使用するのかもしれませんが、初心者のためどのように調べて使用したらよいのかわからないので、質問させていただきました。
よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

Python3.6

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

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

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

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

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

meg_

2023/05/26 14:13

> 最終的にはcsvにて以下のように出力したいです > Japan,America,Franse > ichigo,strawberry,fraise ・「Franse」は「France」のタイプミスですか? ・入力用 では「japan」であり、表記ゆれの考慮が必要ということでしょうか?
pythongirl

2023/05/26 14:25

コメントありがとうございます!申し訳ありません、タイプミスです! 投稿後に気づきましたが、どこで修正したら良いのかわからずで コメント感謝いたします。 表記ゆれの考慮は必要ありません。 正しくは以下です。 何卒よろしくお願い致します。 例) 並べ替え用  ["Japan","America","France"] 入力用 {0:{0:"France",1:"Japan",2:"America"},1:{0:"fraise",1:"ichigo",2:"strawberry"}} output = {"0":{0:Japan,1:America,2:France},"1":{0:ichigo,1:strawberry,2:fraise}} 最終的にはcsvにて以下のように出力したいです Japan,America,France ichigo,strawberry,fraise
guest

回答2

0

python

1import csv 2from pprint import pprint 3 4array = ["Japan", "America", "France"] 5lst = {0: {0: "France", 1: "Japan", 2: "America"}, 6 1: {0: "fraise", 1: "ichigo", 2: "strawberry"}} 7 8idx = [*enumerate(sorted(lst[0], key=lambda k: array.index(lst[0][k])))] 9output = {k: {i: v[j] for i, j in idx} for k, v in lst.items()} 10pprint(output) 11 12# {0: {0: 'Japan', 1: 'America', 2: 'France'}, 13# 1: {0: 'ichigo', 1: 'strawberry', 2: 'fraise'}} 14 15with open('output.csv', 'w') as f: 16 csv.writer(f).writerows(v.values() for v in output.values())

投稿2023/05/26 21:16

編集2023/05/26 22:06
melian

総合スコア19771

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

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

pythongirl

2023/05/29 11:21

ご回答ありがとうございます。 並び替えはしていただきましたが、最終結果が異なっていましたので otn様をベストアンサーにさせていただきました。 お忙しいところありがとうございました。
melian

2023/05/29 11:26

一応、出力結果の output.csv の中身は以下の通りになっています。 Japan,America,France ichigo,strawberry,fraise
guest

0

ベストアンサー

そういう形式の中間データを作るのは面倒です。一気にCSVを作るのが簡単です。
あと、listという変数名を使うのは良くないです(理由はよく考えればわかります)。なので変数名は変えています。

Python

1head = ["Japan","America","France"] 2data = {0:{0:"France",1:"Japan",2:"America"},1:{0:"fraise",1:"ichigo",2:"strawberry"}} 3 4data = [[y for y in x.values()] for x in data.values()] 5order = [data[0].index(x) for x in head] 6for row in data: 7 print(",".join([row[order[i]] for i in range(len(row))]))

辞書のキーは無視してるので、3.6だともしかすると駄目かもしれませんが、とりあえず。

投稿2023/05/26 15:36

otn

総合スコア84538

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

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

pythongirl

2023/05/27 10:43

ご回答ありがとうございます。 実行できました! listは使用不可ですね。失礼いたしました。 教えてくれた学校の先生からは、最後のコードの部分一行で済むと言われ試行錯誤していたのですが、難しいでしょうか。 重ねての質問失礼いたします。
otn

2023/05/27 10:48

> 最後のコードの部分 具体的に何のことですか?
pythongirl

2023/05/29 11:18

ご質問に気づかず、返答遅くなり申し訳ございません。 一行でというのは私の勘違いでした。 otn様をベストアンサーにさせていただきます。 ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問