Python では、明示的な型チェックを使用して解決したリストと辞書を変換して、整数と整数のリストの違いを判断するという単純な問題があります。私はPythonに少し慣れていません。問題を解決するためのより「pythonic」な方法、つまり明示的な型チェックを回避する方法があるかどうか知りたいです。
要するに、値を使用して辞書のキーをソートしようとしていますが、各キーには複数の値を含めることができ、キーはリストに複数回表示する必要があります。データは の形式で提供され{'a':1, 'b':[0,2],...}
ます。私が ( sorted( , key = ) を使用して) 思いついたことはすべて、リスト 1 の長さではなく、整数としてではなく、一度発生する値を指定できるという事実によってつまずきます。
{'a':3, 'b':0, 'c':[2,4], 'd':[1,5]}
フォームの辞書とリストの間で変換したいと思います['b', 'd', 'c', 'a', 'c', 'd']
(リスト内の項目の位置は、辞書の値によって指定されます)。
この関数list_to_dictionary
には、リストに表示される各項目のキーと、リスト内の場所を示す値が必要です。アイテムが複数回表示される場合、値はそれらのすべての場所を格納するリストにする必要があります。
この関数dictionary_to_list
は、値でソートされたディクショナリのキーで構成されるリストを作成する必要があります。値が単一の整数ではなく、整数のリストである場合、そのキーは、対応するソートされた場所でリストに複数回表示される必要があります。
私の解決策は次のとおりです。
def dictionary_to_list(d):
"""inputs a dictionary a:i or a:[i,j], outputs a list of a sorted by i"""
#Converts i to [i] as value of dictionary
for a in d:
if type(d[a])!=type([0,1]):
d[a] = [d[a]]
#Reverses the dictionary from {a:[i,j]...} to {i:a, j:a,...}
reversed_d ={i:a for a in d for i in d[a]}
return [x[1] for x in sorted(reversed_d.items(), key=lambda x:x[0])]
def list_to_dictionary(x):
d = {}
for i in range(len(x)):
a = x[i]
if a in d:
d[a].append(i)
else:
d[a]=[i]
#Creates {a:[i], b:[j,k],...}
for a in d:
if len(d[a])==1:
d[a] = d[a][0]
#Converts to {a:i, b:[j,k],...}
return d
コードの残りの部分との相互作用のために、辞書の値として単一の整数の代わりに長さ 1 のリストを持つように問題を変更することはできません。これを処理する簡単な方法があるはずですが、わかりません。ここでのより良い解決策は、私の python スクリプトにいくつかのアプリケーションを用意することです。
ありがとう