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

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

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

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Q&A

解決済

2回答

416閲覧

辞書の中の重複したキーを探して新しいリストに値を入れたい。

tetra10270

総合スコア8

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

0グッド

0クリップ

投稿2017/09/25 11:43

編集2017/09/26 05:08

皆様いつもお世話になっております。
すみません、質問が抽象的でしたので修正致します。
当方Mayaという3Dソフトを使っておりまして、
3Dオブジェクト上で重複した位置に存在する頂点を検索してリストにしたいと思っています。

python

1#オブジェクト名と頂点IDのリスト 2vertices = ['pPlane1.vtx[0]', 'pPlane1.vtx[1]', 'pPlane1.vtx[2]', 'pPlane1.vtx[3]', 'pPlane1.vtx[4]'] 3 4#頂点のXYZ座標のリスト 5pos =[(-0.5, -0.0, 0.5), (0.0, -0.0, 0.5), (0.5, -0.0, 0.5), (-0.5, -0.0, 0.5), (0.0, 0.0, 0.5.0)] 6 7#頂点座標をキーにして、頂点番号を値に入れる 8dPosVtx = dict(zip(vertices,pos)) 9 10print dVtxPos 11///{'pPlane1.vtx[3]': (-0.5, -0.0, 0.5), 'pPlane1.vtx[4]': (0.0, 0.0, 0.5), 'pPlane1.vtx[1]': (0.0, -0.0, 0.5), 'pPlane1.vtx[2]': (0.5, -0.0, 0.5), 'pPlane1.vtx[0]': (-0.5, -0.0, 0.5)} 12 13

辞書化したのは頂点の位置と頂点番号を紐付けたいからですが、結果的にX,Y,Z座標上に存在する重複した頂点番号をリスト化できれば大丈夫です。
すみませんがよろしくお願い致します。

-.

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

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

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

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

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

LouiS0616

2017/09/25 13:13 編集

既に回答があるように、そもそもキーが重複した辞書listAを用意することは不可能です。どのような目的があって質問をしたのか追記すると、別の視点から回答を得られるかもしれません。
guest

回答2

0

辞書の場合、複数の同一キーが定義されたらどちらかだけが有効になるため、listAに同一キーで別のバリューになるものは存在しないかと思います。

python

1listA = {1: 'a' ,2: 'b' ,3: 'c' ,4: 'd',5: 'e',6: 'f', 7: 'g',8: 'h',9: 'i',1: 'k',5: 'l',8: 'm'} 2print listA

{1: 'k', 2: 'b', 3: 'c', 4: 'd', 5: 'l', 6: 'f', 7: 'g', 8: 'm', 9: 'i'}

投稿2017/09/25 12:27

akichim21

総合スコア93

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

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

tetra10270

2017/09/26 02:59

ご回答ありがとうございます。 確かに重複したら検索の不都合が出ますね。 辞書についてはもう少し工夫をしてみます。
tetra10270

2017/09/26 06:35

おっしゃられたとおり、浮動小数点のエラーでした。 roundで4桁までにしたらうまく取得することが出来ました。 これで先に進めます!本当にありがとうございました!
guest

0

ベストアンサー

こんな感じでしょうか。

Python

1from collections import Counter 2from pprint import pprint 3 4vertices = ['pPlane1.vtx[0]', 'pPlane1.vtx[1]', 'pPlane1.vtx[2]', 'pPlane1.vtx[3]', 'pPlane1.vtx[4]'] 5pos =[(-0.5, -0.0, 0.5), (0.0, -0.0, 0.5), (0.5, -0.0, 0.5), (-0.5, -0.0, 0.5), (0.0, 0.0, 0.5)] 6 7indice = [pos.index(key) for key, val in Counter(pos).items() if val > 1] 8duplicate_vertices = [vertices[index] for index in indice] 9 10dVtxPos = dict(zip(vertices, pos)) 11pprint(dVtxPos) 12pprint(duplicate_vertices) 13 14"""出力 15{'pPlane1.vtx[0]': (-0.5, -0.0, 0.5), 16 'pPlane1.vtx[1]': (0.0, -0.0, 0.5), 17 'pPlane1.vtx[2]': (0.5, -0.0, 0.5), 18 'pPlane1.vtx[3]': (-0.5, -0.0, 0.5), 19 'pPlane1.vtx[4]': (0.0, 0.0, 0.5)} 20['pPlane1.vtx[0]', 'pPlane1.vtx[1]'] 21"""

辞書と、そのうちvalueが重複しているkeyのリストを出力しています。
pprintは見やすくするためだけに用いています、print文でも大丈夫です。

投稿2017/09/26 03:23

LouiS0616

総合スコア35660

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

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

tetra10270

2017/09/26 05:08 編集

ご回答ありがとうございます。 頂いたコードで試したところ、ひとつの重複頂点しか検索出来ませんでした。 実際には1000以上の頂点を検索することになるかと思います。 参考画像を添付致しましたので、ご覧いただければと思います。 ![vertices](477ce4f349788736e365df23aef3ae19.png)
LouiS0616

2017/09/26 05:21

浮動小数なので、誤差が出ているかもしれないですね。
tetra10270

2017/09/26 06:36

おっしゃられたとおり、浮動小数点のエラーでした。 roundで4桁までにしたらうまく取得することが出来ました。 これで先に進めます!本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問