3

重複の可能性:
Python - 2 つのリストの交差

共通する要素の数を見つけるために、2 つのリストを比較しようとしています。

私が抱えている主な問題は、どちらかのリストに繰り返し要素が含まれている場合です。たとえば、

A = [1,1,1,1]   and  
B = [1,1,2,3]

コードを使用して

n = 0
for x in A:
   if x in B:
      n += 1
print n

n = 4技術的には A のすべての要素が B にあるという出力が得られます

できればセットを使用せずに、コードを適応させることができる出力n = 2、またはこれを達成するための問題についての新しい考え方はありますか?

ありがとう

4

4 に答える 4

6

仕様が何であるかは完全には明確ではありませんが、順序に関係なく、多重度に関係なく、にA表示される要素の数が必要な場合は、次を使用してください。Bcollections.Counter

>>> from collections import Counter
>>> A = [1,1,1,1]
>>> B = [1,1,2,3]
>>> C = Counter(A) & Counter(B)
>>> sum(C.itervalues())
2
>>> list(C.elements())
[1, 1]
于 2012-12-04T20:05:50.243 に答える
2

O(n logn)セットを使用せずに効率的な ( ) 方法を次に示します。

def count_common(a, b):
  ret = 0
  a = sorted(a)
  b = sorted(b)
  i = j = 0
  while i < len(a) and j < len(b):
    c = cmp(a[i], b[j])
    if c == 0:
      ret += 1
    if c <= 0:
      i += 1
    if c >= 0:
      j += 1
  return ret

print count_common([1,1,1,1], [1,1,2,3])

例のように、リストが常に並べ替えられている場合は、2 つのsorted()呼び出しを削除できます。これにより、O(n)アルゴリズムが得られます。

于 2012-12-04T20:11:10.607 に答える
1

ここでは、この問題についてまったく異なる考え方を示します。

との 2 つの単語がある"hello"とし"world"ます。共通要素を見つけるために、 を反復処理して"hello"、 を得ることができます['h', 'e', 'l', 'l', 'o']。リスト内の各要素について、2 番目の要素から削除しlist(word)ます。

  1. ですか?'h'_ ['w', 'o', 'r', 'l', 'd']いいえ。
  2. ですか?'e'_ ['w', 'o', 'r', 'l', 'd']いいえ。
  3. ですか?'l'_ ['w', 'o', 'r', 'l', 'd']はい!
  4. からそれを削除して"world"ください['w', 'o', 'r', 'd']
  5. ですか?'l'_ ['w', 'o', 'r', 'd']いいえ。
  6. ですか?'o'_['w', 'o', 'r', 'd']
  7. はい!['w', 'o', 'r', 'd']私に与えて、それを削除します['w', 'r', 'd']

元のオブジェクト (コピーを保持していることを確認してください) と新しく生成されたオブジェクトの長さを比較すると、2 つの共通文字を示す 2 の違いが表示されます。

于 2012-12-04T19:50:17.140 に答える
0

では、2 つのリストの同じインデックスにある要素だけが等しいかどうかをプログラムに確認させたいですか? それは非常に簡単です: 変数 i を使用して、2 つの配列 (同じ長さであると推測されます) の長さを反復処理し、それぞれを A.index(i) と B で比較します。インデックス (i) 関数。もしよろしければ、コードを投稿できます。

これがやりたくない場合は、問題をより明確にしてください。

于 2012-12-04T19:43:42.003 に答える