3

私は一般的にプログラミングが初めてなので、ここで自分のスキルを本当に広げたいと思っています。オブジェクトから文字列のリストを取得し、デザインのテンプレートに基づいて並べ替えるスクリプトを作成しようとしています。テンプレートにない項目は末尾に追加されます。

これが私が今やっている方法ですが、誰かがより良い/より効率的な方法を提案できますか?

    originalList = ['b', 'a', 'c', 'z', 'd']
    listTemplate = ['a', 'b', 'c', 'd']
    listFinal = []

    for thing in listTemplate:
        if thing in originalList:
            listFinal.append(thing)
            originalList.pop(originalList.index(thing))

    for thing in originalList:
            listFinal.append(thing)
            originalList.pop(originalList.index(thing))
4

5 に答える 5

2

これを試して:

originalList = ['b', 'a', 'c', 'z', 'd']
listTemplate = ['a', 'b', 'c', 'd']

order = { element:index for index, element in enumerate(listTemplate) }
sorted(originalList, key=lambda element: order.get(element, float('+inf')))

=> ['a', 'b', 'c', 'd', 'z']

これがどのように機能するかです:

  • listTemplateまず、 の各要素について、他の要素に対する相対的な順序を示す辞書を作成します。たとえば、ais 0bis1など
  • 次に、並べ替えますoriginalList。その要素の 1 つがorderディクショナリに存在する場合は、その相対位置を使用して並べ替えます。存在しない場合は、正の無限値を返します。これにより、含まれていない要素が最終的listTemplateに終了し、それらの間でそれ以上の順序付けが行われないことが保証されます。

問題の解決策は正しいですが、あまりpythonicではありません。特に、新しいリストを作成する必要があるときはいつでも、明示的なループ/追加の代わりにリスト内包表記を使用するようにしてください。また、入力リストを「破棄」することはお勧めできません (pop()この場合は使用します)。

于 2013-08-15T18:13:53.307 に答える
1

リストを使用してdictを作成できます。listTemplateこれにより、高価な(O(N))操作をルックアップlist.indexに減らすことができます。O(1)

>>> lis1 = ['b', 'a', 'c', 'z', 'd']
>>> lis2 = ['a', 'b', 'c', 'd']

enumerateアイテムをキーとして (アイテムがハッシュ可能であることを考慮して) ディクテーションを作成し、値としてインデックスを作成するために使用します。

>>> dic = { x:i for i,x in enumerate(lis2) }

dic次のようになります。

{'a': 0, 'c': 2, 'b': 1, 'd': 3}

の各項目についてlis1、dic のインデックスをチェックする必要があります。キーが見つからない場合は、 を返しfloat('inf')ます。

として使用される機能key:

def get_index(key):
   return dic.get(key, float('inf'))

リストを並べ替えます。

>>> lis1.sort(key=get_index)
>>> lis1
['a', 'b', 'c', 'd', 'z']
于 2013-08-15T18:11:18.113 に答える
0

これは、計算の複雑さを改善する方法です。

# add all elements of originalList not found in listTemplate to the back of listTemplate
s = set(listTemplate)
listTemplate.extend(el for el in originalList if el not in s)

# now sort
rank = {el:index for index,el in enumerate(listTemplate)}
listFinal = sorted(originalList, key=rank.get)
于 2013-08-15T18:11:35.093 に答える
0

新しい辞書を作成する必要はまったくありません。

>>> len_lis1=len(lis1)

>>> lis1.sort(key = lambda x: lis2.index(x) if x in lis2 else len_lis1)

>>> lis1
    ['a', 'b', 'c', 'd', 'z']
于 2013-08-15T18:31:06.047 に答える
0

最後のステップでは、次を使用できます。

listFinal += originalList

これらのアイテムを最後に追加します。

于 2013-08-15T18:09:46.453 に答える