0

私はプログラミングに不慣れで、この正確な質問に答えているように見えるQ&Aをここで見つけることができません(Pythonにはたくさんあり、リストには一致する単語や文字がありますが)。

私はこのような2つのリストを持っています:

  list1 = ["INTJ","ENTJ","ESTJ"]
  list2 = ["INTP","ESFJ","ISTJ"]

文字ペアの可能な組み合わせは全部で16あります。I / E(1番目)、S / N(2番目)、T / F(3番目)、P / J(4番目)などの文字ペアの完全一致の数を計算することができました。

3文字、2文字、1文字の正確な一致がいくつあるかを追跡するにはどうすればよいですか?3文字の一致のバリエーションの例を次に示します。

 ISTP and ISTJ (I + S + T)
 INFP and INTP (I + N + P)

このような文字ペアの一致の数を数えることでユーザー@thkangの助けを得ましたが、一致の組み合わせを追跡するためにこのコードを再配置する方法がわかりません。これを達成するために、他の方法でマッチを保存する必要がありますか?

matches = {0:0, 1:0, 2:0, 3:0}

for item1, item2 in zip(list1, list2):
   for i in xrange(4):
      if item1[i]==item2[i]: 
      matches[i] += 1

total_letters_compared = #length of a list * 4
total_correct_matches = #sum(matches.values())
nth_letter_pair_matches = #matchs[n-1]

これは私が書いたコードですが、それは単なる悪いコードであることがわかりました。誰かが私がこれを正しくするのを手伝ってくれる?

matches = {0:0, 1:0, 2:0, 3:0}
four_letter_matches = 0
three_letter_matches = 0
two_letter_matches = 0

for item1, item2 in zip(actual, typealyzer):
if item1[0:2] == item2[0:2]\
or item1[0], item1[1], item1[3] == item2[0], item2[1], item2[3]\
or item1[1], item1[2], item1[3] == item2[1], item2[2], item2[3]\
or item1[0], item1[2], item1[3] == item2[0], item2[2], item2[3]:
    three_letter_matches = three_letter_matches + 1 

    elif item1[0:1] == item2[0:1]\
or item1[0], item1[1] == item2[0], item2[1]\
or item1[0], item1[2] == item2[0], item2[2]\
or item1[0], item1[3] == item2[0], item2[3]\
or item1[1], item1[2] == item2[1], item2[2]\
or item1[1], item1[3] == item2[1], item2[3]:
    #and so forth...
        two_letter_matches = two_letter_matches + 1 

    #I think I can get the one-letter matches by matches[1] or matches[2] or matches[3] or matches[4] 
for i in xrange(4):
    if item1[i]==item2[i]: 
        matches[i] += 1

どういうわけか、3文字、2文字、1文字の一致を別々に印刷できるようにしたい

print str(three_letter_matches)
print str(two_letter_matches)
print str(one_letter_matches)
4

2 に答える 2

0

私があなたの質問を正しく理解していれば、一致するすべての組み合わせを次のように追跡できます。

list1 = ['INTJ','ENTJ','ESTJ']
list2 = ['INTP', 'ESFJ', 'ISTJ']
import collections
import itertools
matches = collections.defaultdict(list)
for item1,item2 in itertools.product(list1,list2):
    match = ''
    for i in xrange(4):
        if item1[i] == item2[i]:
            match += item1[i]
    if len(match):
        matches[match].append((item1,item2))

最終的にmatchesは次のようになります。

{'ITJ': [('INTJ', 'ISTJ')], 
 'EJ': [('ENTJ', 'ESFJ')], 
 'INT': [('INTJ', 'INTP')], 
 'J': [('INTJ', 'ESFJ')], 
 'STJ': [('ESTJ', 'ISTJ')], 
 'TJ': [('ENTJ', 'ISTJ')], 
 'T': [('ESTJ', 'INTP')], 
 'NT': [('ENTJ', 'INTP')], 
 'ESJ': [('ESTJ', 'ESFJ')]}

特定の一致の発生回数をカウントするだけの場合は、次のようにコードを変更できます。

list1 = ['INTJ','ENTJ','ESTJ']
list2 = ['INTP', 'ESFJ', 'ISTJ']
import collections
import itertools
matches = collections.defaultdict(lambda: 0)
for item1,item2 in itertools.product(list1,list2):
    match = ''
    for i in xrange(4):
        if item1[i] == item2[i]:
            match += item1[i]
    if len(match):
        matches[match] += 1

与える:

{'ITJ': 1, 'EJ': 1, 'INT': 1, 'J': 1, 'STJ': 1, 'TJ': 1, 'T': 1, 'NT': 1, 'ESJ': 1}
于 2013-03-17T13:44:52.683 に答える
0
import itertools as IT
import collections

list1 = ["INTJ","ENTJ","ESTJ"]
list2 = ["INTP","ESFJ","ISTJ"]

matches = collections.Counter()
for item1, item2 in zip(list1, list2):
    for n in range(1,4):
        for idx in IT.combinations(range(4), n):
            if all(item1[i] == item2[i] for i in idx):
                print(item1, item2, idx)
                matches[n] += 1

print(matches)

収量

% test.py
('INTJ', 'INTP', (0,))
('INTJ', 'INTP', (1,))
('INTJ', 'INTP', (2,))
('INTJ', 'INTP', (0, 1))
('INTJ', 'INTP', (0, 2))
('INTJ', 'INTP', (1, 2))
('INTJ', 'INTP', (0, 1, 2))
('ENTJ', 'ESFJ', (0,))
('ENTJ', 'ESFJ', (3,))
('ENTJ', 'ESFJ', (0, 3))
('ESTJ', 'ISTJ', (1,))
('ESTJ', 'ISTJ', (2,))
('ESTJ', 'ISTJ', (3,))
('ESTJ', 'ISTJ', (1, 2))
('ESTJ', 'ISTJ', (1, 3))
('ESTJ', 'ISTJ', (2, 3))
('ESTJ', 'ISTJ', (1, 2, 3))
Counter({1: 8, 2: 7, 3: 2})

何が一致するかを示すために、追加の print ステートメントを含めました。

('ESTJ', 'ISTJ', (2, 3))

2 つのリストがインデックス 2 と 3、つまり文字 T と J で一致することを示します。

Counter({1: 8, 2: 7, 3: 2})

は、1 文字の一致が 8 つ、2 文字の一致が 7 つ、3 文字の一致が 2 つあることを示します。

于 2013-03-17T13:45:24.170 に答える