3

不明な数のサブリストを含むリストを生成するアルゴリズムがあり、各サブリストには不明な数の文字列要素と 1 つの浮動小数点数があります。このフロートに従って、これらのサブリストをメイン リスト内でソートする必要があります。また、サブリスト内の文字列の順序は並べ替えられません。

現在、dictを使用してソートするコードのチャンク(以下にリンク)を実行しています。ご覧のとおり、KeyErrors が発生しています。私は以前に辞書を扱ったことがないので、ここからどこへ行くべきかわかりません。より良い方法があれば、辞書もそれに対して開かれています。http://ideone.com/wr8UA

フロートはシーケンシャルではありません。私が持っている方法を使用して、これがどれほど大きな取引であるかはわかりません。つまり、数字はときどきスキップされます (Ideone の例のリストでは、1.0、2.0、4.0 です。実行時にこの状況をシミュレートするために 3.0 をスキップしています)。それらはサブリストの特定の場所にもないため、すべての for ループがそれらを検索します。

これが明確であることを願っています。私は以前に質問してみましたが、何が人々を混乱させたかについての質問ではなく、反対票を獲得しました。何か問題がある場合はお知らせください。みんな、ありがとう!

編集:要求された本文のコード:

listed = [ ["1 NWZ", "1 RWZ", "2 NWZ", "2 RWZ", "1E HZ", "1W HZ", "1-2EHZ", 2.0, "2W HZ"],
["1 NWZ", "1W HZ", "3E FZ", "SNOK", "POK", 3.0, "1-2EHZ", "2E AK", "2W HZ"],
["1 BW", "1AW AS", "3E FZ", "1BWAK", "POK", "TESTK", "1-2EHZ", "2E AK", 1.0]] 

dictionary={}
for sub_list in listed:
    for value in sub_list:
        if isinstance(value,float):
            dictionary[str(value)]=sub_list
        else:
            pass
ordered_list=[]
    for i in range(1,len(listed)+1):
    if dictionary[str(i)]:
        ordered_list.append(dictionary[str(i)])

for sub_list in ordered_list:
    print sub_list
4

6 に答える 6

9

このsortメソッドには便利なkeyキーワード引数があり、リストを並べ替える情報を決定するために呼び出す関数を指定できます。

リストの並べ替えは、各サブリストに含まれるfloat値を返す関数を作成するのと同じくらい簡単です。

def sortOnFloat(sublist):
    return [v for v in sublist if isinstance(v, float)]

listすべてのfloat値のaを返すだけであることに注意してください。1つだけを返すよりもはるかに簡単です。これは、サブリストに0個のfloat値がある場合でも機能します。

リストを次のように並べ替えます。

listed.sort(key=sortOnFloat)

私はあなたの例を複製し、上記の方法で更新しました:http: //ideone.com/u8ufK

生成された出力:

['1 BW', '1AW AS', '3E FZ', '1BWAK', 'POK', 'TESTK', '1-2EHZ', '2E AK', 1.0]
['1 NWZ', '1 RWZ', '2 NWZ', '2 RWZ', '1E HZ', '1W HZ', '1-2EHZ', 2.0, '2W HZ']
['1 NWZ', '1W HZ', '3E FZ', 'SNOK', 'POK', 3.0, '1-2EHZ', '2E AK', '2W HZ']

この.sort()メソッドはリストをインプレースでソートすることに注意してください。このsorted()関数を使用して、並べ替えられた新しいリストを生成することもできます。同じ引数を取ります:

orderedlist = sorted(listed, key=sortOnFloat)

ただし、インプレースソートは常に高速であることに注意してください。

于 2012-07-06T14:26:31.423 に答える
2

並べ替えるキーを抽出する関数を作成し、sortedを呼び出します。

listed = [ ["1 NWZ", "1 RWZ", "2 NWZ", "2 RWZ", "1E HZ", "1W HZ", "1-2EHZ", 2.0, "2W HZ"],
["1 NWZ", "1W HZ", "3E FZ", "SNOK", "POK", 3.0, "1-2EHZ", "2E AK", "2W HZ"],
["1 BW", "1AW AS", "3E FZ", "1BWAK", "POK", "TESTK", "1-2EHZ", "2E AK", 1.0]] 

def get_key(l):
    return next(e for e in l if type(e) is float)

print sorted(listed, key=get_key)
于 2012-07-06T14:26:37.103 に答える
1

このリンクは、ほぼすべての言語でカスタマイズされた並べ替えを実装する方法を提供します。

カスタム コンパレータを使用した並べ替え

于 2012-07-06T14:28:40.270 に答える
0

リスト内の数値は浮動小数点数であるためエラーが発生しますが、整数を使用してキーを検索します。

listed = [ ["1 NWZ", "1 RWZ", "2 NWZ", "2 RWZ", "1E HZ", "1W HZ", "1-2EHZ", 2.0, "2W HZ"],
["1 NWZ", "1W HZ", "3E FZ", "SNOK", "POK", 3.0, "1-2EHZ", "2E AK", "2W HZ"],
["1 BW", "1AW AS", "3E FZ", "1BWAK", "POK", "TESTK", "1-2EHZ", "2E AK", 1.0]]

dictionary={}
for sub_list in listed:
    for value in sub_list:
        if isinstance(value,float):  #### you look for floats
            dictionary[str(value)]=sub_list   ### the key is created as string
        else:
            pass
ordered_list=[]
for i in range(1,len(listed)+1):   ### this is a range of INTS!!!!
    if dictionary[str(i)]:
        ordered_list.append(dictionary[str(i)])  #### str(i) is '1', not '1.0' 

for sub_list in ordered_list:
    print sub_list

これは良いコードではないと思うだけです。そもそも、同じリスト内に文字列と数字を混在させてはなりません。そのリストを作成する場合は、たとえば次のようなdictを使用することをお勧めします。

listitem = {'number': 2.0, 'strings': ['1 NHZ', '1 RWZ', 'TESTK']}

お役に立てれば!

于 2012-07-06T14:26:35.767 に答える
0

コードに「1」要素がないため、エラーが発生します。これは実際には「1.0」です (float であるため)。これを行うと、コードが機能します。

for i in range(1,len(listed)+1):
    if dictionary[str(float(i))]:
        ordered_list.append(dictionary[str(float(i))])

しかし、私の意見では、これはあなたがやろうとしていることを行うための良い方法とはほど遠いものであり、多くの人が代替案について良いアドバイスをしてくれました.

于 2012-07-06T14:36:38.093 に答える
0
>>> listed = [ ["1 NWZ", "1 RWZ", "2 NWZ", "2 RWZ", "1E HZ", "1W HZ", "1-2EHZ", 2.0, "2W HZ"],
["1 NWZ", "1W HZ", "3E FZ", "SNOK", "POK", 3.0, "1-2EHZ", "2E AK", "2W HZ"],
["1 BW", "1AW AS", "3E FZ", "1BWAK", "POK", "TESTK", "1-2EHZ", "2E AK", 1.0]]
>>> listed
[['1 NWZ', '1 RWZ', '2 NWZ', '2 RWZ', '1E HZ', '1W HZ', '1-2EHZ', 2.0, '2W HZ'], ['1 NWZ', '1W HZ', '3E FZ', 'SNOK', 'POK', 3.0, '1-2EHZ', '2E AK', '2W HZ'], ['1 BW', '1AW AS', '3E FZ', '1BWAK', 'POK', 'TESTK', '1-2EHZ', '2E AK', 1.0]]
>>> dictionary ={}
>>> for index,sub_list in enumerate(listed):
    for value in sub_list:
        if isinstance(value,float):
            dictionary[value]=index
        else:
            pass


>>> dictionary
{1.0: 2, 2.0: 0, 3.0: 1}
>>> it = sorted(dictionary.items())
>>> it
[(1.0, 2), (2.0, 0), (3.0, 1)]
>>> ordered_list = []
>>> for item in it:
    ordered_list.append(listed[item[1]])


>>> ordered_list
[['1 BW', '1AW AS', '3E FZ', '1BWAK', 'POK', 'TESTK', '1-2EHZ', '2E AK', 1.0], ['1 NWZ', '1 RWZ', '2 NWZ', '2 RWZ', '1E HZ', '1W HZ', '1-2EHZ', 2.0, '2W HZ'], ['1 NWZ', '1W HZ', '3E FZ', 'SNOK', 'POK', 3.0, '1-2EHZ', '2E AK', '2W HZ']]
>>> 
于 2012-07-06T14:34:52.750 に答える