2017-04-10 116 views
3

比方說,我給一本字典:如何比較字典的值(列表)與單獨的列表?

students = {"adrian":["a","b","c","d"], "jamie":["b","b","a","d"], "adam":["a","c","d","d"]} 

而且名單:

answers=["a","b","c","d"] 

我只是想檢查每個元素從針對在字典中的值的給定索引處的答案一致。總之,比較每個列表與答案。 然後我會打印一個學生正確的次數。

例如,如果我比較關鍵「阿德里安」的價值與我會得到4的答案。如果我比較傑米對答案我會得到2.如果我比較亞當的答案我會得到2.

我怎樣才能比較兩個?

非常感謝您的幫助!

+3

請編輯問題並添加您嘗試過的代碼。 –

回答

0

您可以使用壓縮()來獲取值的組合和答案

for k,v in students.items(): 
    ans = 0 
    for i, j in zip(v,answers): 
     if i==j: 
      ans+=1 
    print ans 
2
>>> students = {"adrian":["a","b","c","d"], "jamie":["b","b","a","d"], "adam":["a","c","d","d"]} 
>>> answers = ["a","b","c","d"] 
>>> {s:sum(t == a for t, a in zip(students[s], answers)) for s in students} 
{'jamie': 2, 'adam': 2, 'adrian': 4} 

這對每個學生zip是他們的回答與答案,然後將它們進行比較,然後它總結了造成布爾。

1
import pandas as pd 
students = {"adrian":["a","b","c","d"], "jamie":["b","b","a","d"], "adam":["a","c","d","d"]} 
answers=["a","b","c","d"] 
df = pd.DataFrame(students) 
df.apply(lambda x: x==answers).sum() 

的位的解釋:

df.apply(lambda x: x==answers) 

將比較的答案爲每個學生,導致下面的數組:

adam adrian jamie 
0 True True False 
1 False True True 
2 False True False 
3 True True True 

的.sum()將做逐列總和(鑄真1和假0),將陣列減少到:

adam  2 
adrian 4 
jamie  2 
+0

即使這種方法是可行的,我也不會說在不存在問題標籤時使用熊貓是非常好的。至少添加一個解釋。 – Netwave

0

我想這樣的作品

students = {"adrian":["a","b","c","d"], 
      "jamie":["b","b","a","d"], 
      "adam":["a","c","d","d"]} 
answers = ["a","b","c","d"] 

results = {} 

for k,v in students.items(): 
    results [k] = 0 
    for i,answer in enumerate(v): 
     if answers[i] == v[i]: 
      results[k]+=1 

print (results) 

{'阿德里安:4, '亞當':2, '傑米':2}

+0

這取決於你對複雜的定義是什麼。 –

1

這樣的事情?

def get_correct_answers_count(given_answers, 
           correct_answers): 
    return sum(1 
       for student_answer, correct_answer in zip(given_answers, 
                 correct_answers) 
       if student_answer == correct_answer) 


students_correct_answers_count = { 
    student_name: get_correct_answers_count(given_answers=student_answers, 
              correct_answers=answers) 
    for student_name, student_answers in students.items()} 

給我們

{ '阿德里安':4, '傑米':2 '亞當':2}

0

基於集合A溶液()

示例

data = {'jamie': ['a', 'b', 'c', 'd']} 
answers = ['b', 'd', 'c', 'd'] 
tuples = map(set, zip(data['jamie'], answers)) 
reduce(lambda y, coll: (len(coll) - 1) + y , tuples, 0) 

Out[8]: 2 

該示例使用數據類型集只能包含唯一的事實。所以通過壓縮這兩個列表jamie和答案我得到元組。如果元組中包含兩個相同的元素,則會使其具有唯一性。

當我減少元組列表時,我使用這樣一個事實,即如果該集合中有多個元素,它就是一個錯誤答案的標誌&。