1

次のような 2 つのリストがあります。

a=['not','not','not','not']
b=['not','not']

lenそして、結果が次のようになるように、上記の 2 つのリストの交差を含むリストの を見つける必要があります。

intersection=['not','not']
len(intersection)
2

今問題は、私が試してみたことですがfilter(lambda x: x in a,b)filter (lambda x: x in b,a)2 つのリストのうちの 1 つが他のリストよりも長い場合、交差点ではなく、メンバーシップのチェックだけが行われます。上記の例では、a のすべてのメンバーが b にあるため、共通要素の len は 4 になります。私が代わりに欲しいのは交差点であり、それはlen2です。set().intersection(set())代わりに使用するとセットが作成されますが、これはすべての要素が同じであるため、私が望むものではありません。問題に対する価値のあるコンパクトな解決策を教えてもらえますか?

4

4 に答える 4

1

collections.Counterを使用してもかまわない場合は、次のような解決策があります

>>> import collections
>>> a=['not','not','not','not']
>>> b=['not','not']

>>> c1 = collections.Counter(a)
>>> c2 = collections.Counter(b)

そして、「not」で索引付けします

>>> c1['not'] + c2['not']
6

交差点のために、あなたはする必要があります

>>> (c1 & c2) ['not']
2
于 2013-07-20T13:20:26.833 に答える
0

これを計算する特にコンパクトな方法はありません。まずは解決に向かいましょう。

これintersectionは、短いリストの一部のサブリストです (例: b)。ここで、短いリストが極端に短くない場合にパフォーマンスを向上させるために、長いリストをセットにします (例: set(a))。交差は、短いリスト内のアイテムのリスト内包表記として表現できます。これらのアイテムは、長いセットにも含まれます。

def common_elements(a, b):
    shorter, longer = (a, b) if len(a)<len(b) else (b, a)
    longer = set(longer)
    intersection = [item for item in shorter if item in longer]
    return intersection

a = ['not','not','not','not']
b = ['not','not']
print(common_elements(a,b))
于 2013-07-20T13:01:31.090 に答える
0

までに行いsetます。最初にこれらのリストをセットにしてから、それらの交点を取ります。今、交差点で繰り返しがあるかもしれません。そのため、共通部分の各要素について、aとの繰り返しを最小限に抑えbます。

>>> a=['not','not','not','not']
>>> b=['not','not']
>>> def myIntersection(A,B):
...     setIn = set(A).intersection(set(B))
...     rt = []
...     for i in setIn:
...         for j in range(min(A.count(i),B.count(i))):
...             rt.append(i)
...     return rt
...
>>> myIntersection(a,b)
['not', 'not']
于 2013-07-20T13:16:31.423 に答える
0

次のアプローチを検討しましたか?

a = ['not','not','not','not']
b = ['not','not']

min(len(a), len(b))
# 2

すべての要素が同じであるため、共通要素の数は、両方のリストの長さの最小値にすぎません。

于 2013-07-20T13:21:20.577 に答える