2

キーとしてタプル(文字列と整数を含む)を持ち、値として浮動小数点を持つ辞書があります。例:

first = {}
first['monkey', 1] = 130.0 
first['dog', 2] = 123.0-
first['cat', 3] = 130.0
first['cat', 4] = 130.0
first['mouse', 6] = 100.0

次に、元の辞書キーの2番目の要素をキーとして持つ新しい辞書を作成する必要があります。新しいディクショナリの値は、キーがソートされた場合の場所になります。これに加えて、2つの例外があります。

  1. 2つのdictの値が等しいが、キーの文字列が異なる場合は、キーのintが最も低い方を上に配置する必要があります。

  2. 2つのdictの値が等しいが、キーのintが異なる場合、それらは新しいdictで等しく配置され、すべて同じ値を取得する必要があります。

したがって、新しい辞書は次のようになります。

second[1] = 3
second[2] = 2
second[3] = 4
second[4] = 4
second[6] = 1

私のコードを与えずに他の誰かに私の問題を解決するように頼むのは無知であることを私は知っています。しかし、私は単に問題に取り組む方法を知りません。この問題をどのように解決するか、またはアルゴリズムの擬似コードを教えていただければ幸いです。

4

3 に答える 3

3
import itertools as IT

first = {
    ('monkey',1): 130.0,
    ('dog',2): 123.0,
    ('cat', 3): 130.0,
    ('cat', 4): 130.0,
    ('mouse', 6): 100.0
    }

counter = 0
ordered = sorted(first, key = lambda k: (first[k], k[1], k[0]))

second = {}
for key, group in IT.groupby(ordered, first.__getitem__):
    # group = list(group)
    # print(key, group)
    # (100.0, [('mouse', 6)])
    # (123.0, [('dog', 2)])
    # (130.0, [('monkey', 1), ('cat', 3), ('cat', 4)])
    previous = None
    for name, num in group:
        if name != previous:
            counter += 1
        second[num] = counter
        previous = name

print(second)

収量

{1: 3, 2: 2, 3: 4, 4: 4, 6: 1}

説明:

最初のステップは、関連する値に従っての(name, num)キーを並べ替えることです。firstただし、同点の場合numはを使用します。それでも同点の場合は、nameを使用して同点を解除します。

In [96]: ordered = sorted(first, key = lambda k: (first[k], k[1], k[0]))

In [97]: ordered
Out[97]: [('mouse', 6), ('dog', 2), ('monkey', 1), ('cat', 3), ('cat', 4)]

次に、値が同じordered場合は特別なルールがあるため、アイテムをグループ化する必要があります。first[k]グループ化は、itertools.groupbyを使用して実現できます。

In [99]: for key, group in IT.groupby(ordered, first.__getitem__):
   ....:     print(key, list(group))
   ....:     
   ....:     
(100.0, [('mouse', 6)])
(123.0, [('dog', 2)])
(130.0, [('monkey', 1), ('cat', 3), ('cat', 4)])

itertools.groupbyキーの値に応じてアイテムorderedを束にまとめていますfirst.__getitem__(item)。例えば、

In [100]: first.__getitem__(('monkey', 1))
Out[100]: 130.0

In [101]: first.__getitem__(('cat', 3))
Out[101]: 130.0

first.__getitem__(item)ただの凝った書き方first[item]です。私が使用する理由first.__getitem__itertools.groupby、2番目の引数に関数を期待しfirst.__getitem__、法案に適合する関数であるためです。


最後に、各グループを繰り返し処理します。基本的に、これを実行したいと思います。

for name, num in group:
    counter += 1
    second[num] = counter

ただし、名前が等しい場合は、カウンターを進めたくありません。したがって、名前が等しいかどうかを確認するには、以前の名前を保存すると便利です。

previous = None
for name, num in group:
    if name != previous:
        counter += 1
    ...
    previous = name   

警告:rkd91のコードと私のコードは異なる答えを生成することに注意してください

first = {
    ('monkey',1): 130.0,
    ('dog',2): 123.0,
    ('cat', 3): 129.0,
    ('cat', 4): 130.0,
    ('mouse', 6): 100.0
    }

おそらく仕様の解釈が異なるためです。どちらが目的の出力を生成するかは、あなたに任せます。

@rdk91のコードは

{1: 4, 2: 2, 3: 5, 4: 3, 6: 1}

私のコードは

{1: 4, 2: 2, 3: 3, 4: 5, 6: 1}
于 2013-02-13T21:53:22.077 に答える
2

1)を使用してKey-Valueタプルのリストを取得しますfirst_list = first.items()

2)基準に従ってリストをソートするカスタムコンパレータ関数を作成します。

3)を使用してリストを並べ替えますfirst_list.sort(comparator)

4)ソートされたリストから新しい辞書を作成します。

于 2013-02-13T21:39:01.510 に答える
1
rob@rivertam:~/Programming$ cat sorter.py 
first = {}
first['monkey', 1] = 130.0
first['dog', 2] = 123.0
first['cat', 3] = 130.0
first['cat', 4] = 130.0
first['mouse', 6] = 100.0

# Get the keys of first, sorted by the value (ascending order), and then by the integer in the key (descending order) if two keys have the same value

s = sorted(first, key=lambda x: x[0])
s.reverse()
s = sorted(s, key=lambda x: first[x])

# Loop through these, and create a new list where the key is the integer in the old key, and the value is the position in the sorted order.

last_val = None
last = (None, None)
index = 0
new_dict = {}

for item in s:
    if not ((first[item] == last_val) and (item[1] != last[1]) and item[0] == last[0]):
        # When we have the same value, the same string but a different integer from the last key, consider it to be the same position in the sorted order.
        index += 1
    new_dict[item[1]] = index
    last_val = first[item]
    last = item

print new_dict
rob@rivertam:~/Programming$ python sorter.py 
{1: 3, 2: 2, 3: 4, 4: 4, 6: 1}
于 2013-02-13T21:55:44.503 に答える