0

私は Python を学ぼうとしていますが、現在の問題に対する答えにたどり着くことができましたが、将来、より良い答えを見つける方法を知りたいと思っています。

私の目標は、文字列のリストを入力として取り、文字列内の文字の結合である文字列を返すことでした。

unionStrings( ("ab", "bc"))

「abc」を返します。

私は次のように実装しました:

def unionStrings( strings ):
     # Input: A list of strings
     # Output: A string that is the (set) union of input strings
    all = set()
    for s in strings:
         all = all.union(set(s))

    return "".join(sorted(list(all)))

for ループは不要だと感じ、よりきちんとした、より pythonic(?) な改善を探しました。

最初の質問set.union():の代わりにクラス メソッドを使用することにつまずきましたset1.union(set2)。標準の Python ドキュメントでこれを見つけることができたはずですか? 私はそこでそれを見つけることができませんでした。

そこで、次のように set.union() を使用してみました:

>>> set.union( [set(x) for x in ("ab","bc")] )
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: descriptor 'union' requires a 'set' object but received a 'list'

繰り返しますが、私はつまずいて、最終的に次のように呼び出す必要があることに気付きました。

>>> set.union( *[set(x) for x in ("ab","bc")] )
set(['a', 'c', 'b'])

2番目の質問set.union:これは、 (事実上)次のように宣言されていることを意味すると思います

set.union( *sets)

そしてそうではない

set.union( setsList ) 

あれは正しいですか?(私はまだスプラット '*' の使い方を学んでいます。)

3 番目の質問: の署名に関するドキュメントはどこにありset.union()ますか? set/freezeset doc には見当たりませんでしたし、inspectモジュールから何も得られませんでした。モジュールかどうかさえわかりませんsetが、タイプのようです。それはモジュールで定義されていますか、それとも何ですか?

私の複雑な質問を読んでくれてありがとう。もっと「Pythonドキュメントをナビゲートするにはどうすればいいですか?」です。「Pythonコードでこれを行うにはどうすればよいですか?」より。


jonrsharpe のコメントへの対応:

ああああ!私は、個別の静的メソッドとインスタンス メソッドを定義する C++ に慣れています。あなたがそれを説明した今、私は何が起こっているのかを本当に見ることができます.

私が違うことをするかもしれない唯一のことは、それを次のように書くことです

t = set.union( *[set(x) for x strings] )
return "".join(sorted(t))

機能的には、文字列が異なる役割を果たしていない場合に、strings[0]文字列とは異なる扱いをするのが面倒だからです。strings[1:]それらの 1 つを呼び出さなければならない場合は、とにかくそれを行うset()ので、それらすべてを呼び出したいと思います。union()しかし、それはただのスタイルですよね?

4

1 に答える 1

2

ここでいくつかの質問があります。まず、次のことを知っておく必要があります。

Class.method(instance, arg)

次と同等です。

instance.method(arg)

たとえば、メソッド。クラスでメソッドを呼び出して明示的にインスタンスを提供するか、単にインスタンスで呼び出すことができます。

UppercaseWords歴史的な理由から、標準ライブラリと組み込み型の多くは、クラス名の規則に従っていませんが、クラスです。したがって

set.union(aset, anotherset)

と同じです

aset.union(anotherset)

setメソッドは、頻繁に使用されるため、特に注意が必要です。メソッドのインスタンスであるset.method(arg1, arg2, ...)必要がarg1ありますが、他のすべての引数は変換されます (2.6 以降)。set

setこれはすべてに当てはまるため、ドキュメントでは直接カバーされていません。Python はかなり一貫しています。

「スプラット」する必要があるという点では、ドキュメントに次のように記載されていることに注意してください。

union(other, ...)

それよりも

union(others)

つまり、各イテラブルは個別の引数であるため、イテラブルのリストをアンパックする必要があります。


したがって、関数は次のようになります。

def union_strings(strings):
    if not strings:
        return ""
    return "".join(sorted(set(strings[0]).union(*strings[1:])))

または、次の特別なケースを避けるstrings[0]:

def union_strings(strings): 
    if not strings:
        return ""
    return "".join(sorted(set.union(*map(set, strings))))
于 2014-08-05T19:53:41.713 に答える