27

私は最近、いくつかの文字列をJava TreeSetに入れ、距離ベースのコンパレータを実装し、日没に向かって陽気に進んで、特定の問題を解決するために特定のスコアを計算するJavaコードに出くわしました。

私の質問、

  • Pythonで利用できる同等のデータ構造はありますか?

    • Javaツリーセットは、基本的に、この順序付けを実現するために何らかのコンパレーターを使用できる順序付けされた辞書のように見えます。
  • OrderedDict用のPy3K用のPEPがあるようですが、2.6.xを使用しています。そこにはたくさんの順序付けられたdict実装があります-特に推奨できる人はいますか?

PS、追加するだけです-おそらくDictMixinまたはUserDictをインポートして、独自のソート/順序付けされた辞書を実装し、コンパレータ関数を介してそれを実現することができます-しかし、それはやり過ぎのようです。

ありがとう。


アップデート。答えてくれてありがとう。少し詳しく説明すると、(特定の値lnが与えられた場合)のように定義された比較関数があるとします。

def mycmp(x1, y1, ln):
  a = abs(x1-ln)
  b = abs(y1-ln)
  if a<b:
    return -1
  elif a>b:
    return 1
  else:
    return 0

これを、ここに示されている順序付けされたdictリンクに示されている順序付けにどのように統合するかについては少しわかりません。

何かのようなもの、

OrderedDict(sorted(d.items(), cmp=mycmp(len)))

アイデアは大歓迎です。

4

6 に答える 6

8

のPython2.7ドキュメントには、Python2.4以降で実行されるcollections.OrderedDictOrderedDictレシピへのリンクがあります。

編集:並べ替えに関して:key=ではなく使用しcmp=ます。それはより速いコードにつながる傾向があり、さらに、cmp=キーワードはPython3で削除されました。

d={5:6,7:8,100:101,1:2,3:4}
print(d.items())
# [(1, 2), (3, 4), (100, 101), (5, 6), (7, 8)]

あなたが投稿したコードは、あなたmycmpが何を渡したいのかを明確にしていませんx1。以下では、x1が各キーと値のペアのであると想定しています。もしそうなら、あなたはこのようなことをすることができます:

length=4
print(sorted(d.items(),key=lambda item: abs(item[1]-length) ))
# [(3, 4), (1, 2), (5, 6), (7, 8), (100, 101)]

key=...関数が渡されますlambda item: abs(item[1]-length)。のそれぞれについてitemd.items()ラムダ関数は数値を返しますabs(item[1]-length)。この番号は、並べ替えに関する限り、アイテムのプロキシとして機能します。Pythonでのイディオムの並べ替えの詳細については、このエッセイを参照してください。

PS。lenPythonの組み込み関数です。それを壊さないようにlen、変数名をに変更しましたlength

于 2010-04-26T01:47:41.630 に答える
4

最近、bisectモジュールを使用してTreeSetforPythonを実装しました。

https://github.com/fukatani/TreeSet

その使用法は、Javaのツリーセットに似ています。

元。

from treeset import TreeSet
ts = TreeSet([3,7,2,7,1,3])
print(ts)
>>> [1, 2, 3, 7]

ts.add(4)
print(ts)
>>> [1, 2, 3, 4, 7]

ts.remove(7)
print(ts)
>>> [1, 2, 3, 4]

print(ts[2])
>>> 3
于 2016-03-19T08:52:06.730 に答える
3

いくつかのサンプルデータを確認する必要がありますが、加重ソートを実行しようとしている場合は、組み込みのpythonsorted()で2つの方法で実行できます。

秩序だったタプルとkey()関数を使用すると:

def cost_per_page(book):
    title, pagecount, cost = book
    return float(cost)/pagecount

booklist = [
        ("Grey's Anatomy", 3000, 200),
        ('The Hobbit', 300, 7.25),
        ('Moby Dick', 4000, 4.75),
]
for book in sorted(booklist, key=cost_per_page):
    print book

または演算子付きのクラスを使用し__cmp__ます。

class Book(object):
    def __init__(self, title, pagecount, cost):
        self.title = title
        self.pagecount = pagecount
        self.cost = cost
    def pagecost(self):
        return float(self.cost)/self.pagecount
    def __cmp__(self, other):
        'only comparable with other books'
        return cmp(self.pagecost(), other.pagecost())
    def __str__(self):
        return str((self.title, self.pagecount, self.cost))

booklist = [
        Book("Grey's Anatomy", 3000, 200),
        Book('The Hobbit', 300, 7.25),
        Book('Moby Dick', 4000, 4.75),
]
for book in sorted(booklist):
    print book

これらは両方とも同じ出力を返します。

('Moby Dick', 4000, 4.75)
('The Hobbit', 300, 7.25)
("Grey's Anatomy", 3000, 200)
于 2010-04-26T02:57:37.900 に答える
0

1.PythonにはSortedセットが組み込まれているとは思いません。このようなものはどうですか?

letters = ['w', 'Z', 'Q', 'B', 'C', 'A']
  for l in sorted(set(letters)):
     print l

2.JavaTreeSetは、と呼ばれる抽象化の実装ですSortedSet。基本タイプは自然な順序で並べ替えられTreeSetます。インスタンスは、compareTo(またはcompare)メソッドを使用してすべてのキー比較を実行します。したがって、カスタムキーは適切に実装する必要があります。compareTo

于 2010-04-26T01:38:32.113 に答える
0

必要なものが常にソートされた順序で繰り返されるセットである場合、これはほとんどの方法でそこに到達する可能性があります。

def invalidate_sorted(f):
    def wrapper(self, *args, **kwargs):
        self._sort_cache = None
        return f(self, *args, **kwargs)
    return wrapper

class SortedSet(set):
    _sort_cache = None

    _invalidate_sort_methods = """
        add clear difference_update discard intersection_update
        symmetric_difference_update pop remove update
        __iand__ __ior__ __isub__ __ixor__
        """.split()

    def __iter__(self):
        if not self._sort_cache:
            self._sort_cache = sorted(set.__iter__(self))
        for item in self._sort_cache:
            yield item

    def __repr__(self):
        return '%s(%r)' % (type(self).__name__, list(self))

    for methodname in _invalidate_sort_methods:
        locals()[methodname] = invalidate_sorted(getattr(set, methodname))
于 2010-04-26T02:47:45.143 に答える
-3

Javaツリーセットを使用する場合:

 import java.util.*;
class Main{
         public static void main(String args[])
          {
             TreeSet<Integer> tr=new TreeSet<>();
             tr.add(3);
             tr.add(5);
             tr.add(7);
             tr.add(6);
             tr.add(3);
             tr.add(8);

             Iterator itr=tr.iterator();
             for(int i=0;i<tr.size();i++)
            {
               System.out.print(tr.get(i)+" ");  
            } 
          }
     }

    >>>> **3 5 6 7 8**


  same AS in python:
from treeset import TreeSet
tr = TreeSet([1,2,2,7,4,3])
print(tr)
>>> [1, 2, 3, 4,7] 
于 2020-02-26T14:24:20.670 に答える