8

まず第一に、私はプログラミングとPythonに不慣れです。ここを調べましたが、解決策を見つけることができません。これがばかげた質問である場合は、ご容赦ください。

2つのリストがあり、2番目のリストのアイテムが最初のリストに何回表示されるかを調べようとしています。

私は次の解決策を持っています:

    list1 = ['black','red','yellow']
    list2 = ['the','big','black','dog']
    list3 = ['the','black','black','dog']
    p = set(list1)&set(list2)
    print(len(p))

2番目のリストに重複が含まれている場合を除いて、正常に機能します。

つまり、上記のlist1とlist2は1を返しますが、理想的には2を返す必要がある場合はlist1とlist3も返します。

誰かがこれに対する解決策を提案できますか?どんな助けでもいただければ幸いです!

ありがとう、

アダム

4

4 に答える 4

9

コレクションタイプにセットを使用しているため、この問題が発生しています。セットには2つの特徴があります。順序付けされていない(ここでは重要ではありません)ことと、要素が一意であることです。したがって、それらをセットに変換すると、それらの共通部分を見つける前に、リスト内の重複が失われます。

>>> p = ['1', '2', '3', '3', '3', '3', '3']
>>> set(p)
set(['1', '2', '3'])

ここで実行しようとしていることを実行する方法はいくつかありますが、まずはlistcountメソッドを確認することから始めます。私はこのようなことをします:

>>> list1 = ['a', 'b', 'c']
>>> list2 = ['a', 'b', 'c', 'c', 'c']
>>> results = {}
>>> for i in list1:
        results[i] = list2.count(i) 
>>> results
{'a': 1, 'c': 3, 'b': 1}

このアプローチでは、辞書(results)を作成し、の要素ごとにlist1、のキーを作成し、resultsで発生する回数をカウントして、それlist2をキーの値に割り当てます。

編集: Lattywareが指摘しているように、そのアプローチはあなたが尋ねたものとは少し異なる質問を解決します。本当に基本的な解決策は次のようになります

>>> words = ['red', 'blue', 'yellow', 'black']
>>> list1 = ['the', 'black', 'dog']
>>> list2 = ['the', 'blue', 'blue', 'dog']
>>> results1 = 0
>>> results2 = 0
>>> for w in words:
        results1 += list1.count(w)
        results2 += list2.count(w)

>>> results1
1
>>> results2
2

これは、私の最初の提案と同じように機能します。メインリスト(ここでは使用します)の各単語を繰り返し処理し、カウンターとwordsに表示される回数を追加します。list1results1list2results2

重複の数だけでなく、より多くの情報が必要な場合は、辞書を使用するか、モジュールCounter内の特殊なタイプを使用することをお勧めします。collectionsカウンターは、上記の例で行ったすべてのことを簡単にするために構築されています。

>>> from collections import Counter
>>> results3 = Counter()
>>> for w in words:
        results3[w] = list2.count(w)

>>> results3
Counter({'blue': 2, 'black': 0, 'yellow': 0, 'red': 0})
>>> sum(results3.values())
2
于 2012-11-10T16:57:11.390 に答える
8

リスト1とリスト2は0を返すべきではありませんか?またはあなたは意味しました

list1 = ['black', 'red', 'yellow']

あなたが欲しいのは、私が思うに、

print(len([w for w in list2 if w in list1]))

セットを使用する際の問題は、セットに重複がないことです。実際、セットを使用する通常の理由は、重複を排除することです。もちろん、それはあなたがここで望まないことです。

于 2012-11-10T16:50:06.370 に答える
2

これは古い質問ですが、誰かが1つ以上のリストから一致を取得する方法や一致の長さを疑問に思っている場合。これもできます。

a = [1,2,3]
b = [2,3,4]
c = [2,4,5]

2つのリストで一致を取得するには、aとbが次のようになります。

d = [value for value in a if value in b] # 2,3 

3つのリストについては、

d = [value for value in a if value in b and value in c] # 2
len(d) # to get the number of matches

また、重複を処理する必要がある場合。事前にリストをセットに変換する必要があります。

a  = set(a) # and so on
于 2018-12-12T18:07:57.727 に答える
0

list2のlist1の要素の頻度をカウントしたい場合は、このソリューションが役立つ可能性があります。

list1 = ['black', 'red', 'yellow']
list2 = ['the', 'big', 'black', 'dog']
list3 = ['the', 'black', 'black', 'dog']

まず、要素の頻度をカウントしlist2てdictを作成し、次に、に従ってdictからsubdictを作成しlist1、合計頻度を取得するには、sub_dctの値をカウントします。

# count the frequency of elements of list1 in list2
def cntFrequency(lst1,lst2):
    dct=dict(Counter(lst2))
    sub_dct={k:dct.get(k,0) for k in lst1}
    return sub_dct

結果は次のようになります。

from collections import Counter

cnt_dct=cntFrequency(list1,list2)
print cnt_dct
print sum(cnt_dct.values())

# Output
{'black': 1, 'yellow': 0, 'red': 0}
1
于 2017-01-17T02:38:47.927 に答える