10

私はpython2.7.3を使用しており、別のリストの値の順序に基づいて辞書のリストを並べ替えようとしています。

IE:

listOne = ['hazel', 'blue', 'green', 'brown']
listTwo = [{'name': 'Steve', 'eyecolor': 'hazel', 'height': '5 ft. 11 inches'},
           {'name': 'Mark', 'eyecolor': 'brown', 'height': '6 ft. 2 inches'},
           {'name': 'Mike', 'eyecolor': 'blue', 'height': '6 ft. 0 inches'},
           {'name': 'Ryan', 'eyecolor': 'brown', 'height': '6 ft, 0 inches'},
           {'name': 'Amy', 'eyecolor': 'green', 'height': '5 ft, 6 inches'}]

listOneの値の順序に基づいてlistTwoを並べ替えると、次のようになります。

print listTwo
[{'name': 'Steve', 'eyecolor': 'hazel', 'height': '5 ft. 11 inches'},
{'name': 'Mike', 'eyecolor': 'blue', 'height': '6 ft. 0 inches'},
{'name': 'Amy', 'eyecolor': 'green', 'height': '5 ft, 6 inches'},
{'name': 'Mark', 'eyecolor': 'brown', 'height': '6 ft. 2 inches'},
{'name': 'Ryan', 'eyecolor': 'brown', 'height': '6 ft, 0 inches'}]

最終的にこのテキストを出力する必要があるので、正しく(正しい順序で)表示するために行ったことは次のとおりです。

for x in xrange(len(listOne)):
    for y in xrange(len(listTwo)):
        if listOne[x] == listTwo[y]["eyecolor"]:
            print "Name: " + str(listTwo[y]["name"]),
            print "Eye Color: " + str(listTwo[y]["eyecolor"]),
            print "Height: " + str(listTwo[y]["height"])

これを実現するために使用できるラムダ式のようなものはありますか?私が望む順序でそれを取得するためのよりコンパクトで複雑でない方法がなければなりません。

4

2 に答える 2

13

最も簡単な方法はlist.index、辞書のリストの並べ替え値を生成するために使用することです。

listTwo.sort(key=lambda x: listOne.index(x["eyecolor"]))

list.indexただし、目の色のリストを線形検索するため、これは少し非効率的です。チェックする目の色がたくさんあると、遅くなります。やや良いアプローチは、代わりにインデックス辞書を構築するでしょう:

order_dict = {color: index for index, color in enumerate(listOne)}
listTwo.sort(key=lambda x: order_dict[x["eyecolor"]])

変更したくない場合は、メソッドの代わりにlistTwo組み込み関数を使用できます。インプレースでソートするのではなく、リストのソートされたコピーを返します。sortedlist.sort

于 2013-03-27T01:39:06.117 に答える
0
listOne = ['hazel', 'blue', 'green', 'brown']
listTwo = [{'name': 'Steve', 'eyecolor': 'hazel', 'height': '5 ft. 11 inches'},{'name': 'Mark', 'eyecolor': 'brown', 'height': '6 ft. 2 inches'},{'name': 'Mike', 'eyecolor': 'blue', 'height': '6 ft. 0 inches'},{'name': 'Ryan', 'eyecolor': 'brown', 'height': '6 ft, 0 inches'},{'name': 'Amy', 'eyecolor': 'green', 'height': '5 ft, 6 inches'}]


order_list_dict = {color: index for index, color in enumerate(listOne)}


print(order_list_dict)

print(sorted(listTwo, key=lambda i: order_list_dict[i["eyecolor"]]))
于 2021-11-22T11:28:39.443 に答える