1

私は現在、次の仕様でリスト ユニオン アルゴリズムに取り組もうとしています: L1 の要素が L2 で発生するよりも L1 で発生する場合、ユニオンは最大発生数、つまり L1 で発生する量を返す必要があります。要素が L1 で発生するよりも L2 で発生する場合、L1 と L2 の役割が入れ替わります。L1 と L2 が互いに素である場合、和集合は通常の和集合を返します。これまでの私の思考プロセスは次のとおりです。

  1. L1 を反復処理します。
  2. L1 の要素が L2 にもあるかどうかを確認します。
  3. L1 の要素が L2 にもある場合は、どちらのリストcountの要素が大きいかを確認します。
  4. L1 と L2 が互いに素である場合、正則和集合を返します。
  5. L2 と L1 を逆にして手順 3 を繰り返します。
  6. 組合を返してください。

max関数を使用して、 Python に、ユニオン内の各要素の多重度が L1 と L2 の両方での要素の最大出現回数であるリストを返すように指示することを考えていました。アイデア?

4

4 に答える 4

4

collectionsこれは、マルチセットを提供する標準モジュールに最適な仕事です。

from collections import Counter

result_list = list((Counter(list1)|Counter(list2)).elements())

Counterオブジェクトはここでマルチセット(通常はその要素の1つ以上のコピーのセット)を表し、和集合演算子は|各要素の最大カウントを保持し、elements()各要素がそのカウントに対応する回数返されるイテレーターを返します。

リストは実際には必要ないが、コード内のマルチセットを操作できる場合Counter(list1) | Counter(list2)は、必要なユニオンマルチセットです。

于 2013-02-15T07:09:58.347 に答える
1
from collections import Counter

counts = Counter(L1)
for value, count in Counter(L2).items()
    counts[value] = max(counts[value], count)
newlist = [value for value, count in counts.items() for _ in range(count)]
于 2013-02-15T04:28:24.460 に答える
1

おそらく、カウントを値として持つdictを使用できます。ユニオンロジックは次のとおりです。

counts = {i: max(L1.get(i,0), L2.get(i,0)) for i in set(L1)|set(L2) }

最終的なリストは

newlist = [value for value, count in counts.items() for _ in range(count)]
于 2013-02-15T22:06:01.483 に答える
-1

リストとその最大/最小プロパティのみを使用したソリューションは、

union = [] 
[union.extend([n] * max(l1.count(n), l2.count(n))) for n in range (min(min(l1),min(l2)), max(max(l1),max(l2))+1)]
于 2013-02-16T03:23:57.763 に答える