2013-02-27 59 views
0

我有兩個列表:算在同步列表中的項目(在字典中的元組)的組合

l1 = ['k', 'l', 'k', 's', 'l', 't', 'k'] 
l2 = ['h', 't', 'h', 't', 't', 's', 's'] 

我想指望在第i個位置的項目組合的次數與第一個列表第二個列表中的相同位置。我想結果是:

KH = 2,LT = 2,ST = 1,TS = 1,KS = 1

我認爲這將是最好先做一個元組出來的名單:

tupleList = zip(l1,l2) 
tupeleList = [('k', 'h'), ('l', 't'), ('k', 'h'), ('s', 't'), ('l', 't'), ('t', 's'), ('k', 's')] 

然後做一個字典來算的元組的該名單上的獨特元素:

myDict = {} 
for item in tupleList: 
    if item[1] in myDict: 
     myDi [ item[1] ] += item[2] 
    else 
     myDi [ item[1] ] = item[2] 

,但我得到這個錯誤:「元組索引超出範圍」。問題是什麼? 是它也許不能有效地先做一個元組?

+0

元組,如列表,在Python從零開始的索引。當然 – 2013-02-27 11:16:40

+0

,我的錯誤 - 但它doesn't工作,因爲那結果是{ '一': 'CCCT', 'C': 'G', 'T': 'GG', 'G':「C 「} – edg 2013-02-27 11:22:28

回答

6

你可以使用一個collections.Counter

In [7]: import collections 
In [10]: count = collections.Counter(zip(l1,l2)) 

In [11]: count 
Out[11]: Counter({('l', 't'): 2, ('k', 'h'): 2, ('s', 't'): 1, ('t', 's'): 1, ('k', 's'): 1}) 

collection.Counterdict一個子類。所以,你可以一般用它你將一個dict,加上有機會獲得一些additional methodselementsmost_commonsubtract


如果你想修理好你貼出的代碼(最小的變化),它看起來像:

l1 = ['k', 'l', 'k', 's', 'l', 't', 'k'] 
l2 = ['h', 't', 'h', 't', 't', 's', 's'] 
tupleList = zip(l1,l2) 
myDict = {} 
for item in tupleList: 
    if item in myDict: 
     myDict[ item ] += 1 
    else: 
     myDict[ item ] = 1 
print(myDict)  

然而,dict■找一個get方法可用於以進一步簡化您的代碼:

for item in tupleList: 
    myDict[item] = myDict.get(item, 0) + 1 

或者,如@JonClements在評論中指出的那樣,你可以使用一個 collections.defaultdict

myDict = collections.defaultdict(int) 
for item in tupleList: 
    myDict[item] += 1 
+0

當我嘗試這個,我得到這個錯誤:AttributeError的:‘模塊’對象有沒有屬性‘反’。我沒有導入集合,並且工作。 – edg 2013-02-27 11:25:15

+0

@edg:本'collections.Counter'在Python2.7介紹。如果您在使用Python的舊版本,您既可以使用'setdefault'方法,或從[這裏]複製'Counter'類(http://code.activestate.com/recipes/576611-counter-class/ )。該版本將適用於Python 2.5或更高版本。 – unutbu 2013-02-27 11:30:39

+0

工作正常,非常感謝:) – edg 2013-02-27 11:34:42