对同步列表中的项目组合进行计数(就像字典中的元组一样)



我有两个列表:

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

我想计算在第一个列表中第I个位置的项与在第二个列表中相同位置的项的组合出现的次数。我希望结果是:

k - h = 2, l-t = 2, s - t = 1, t - s = 1,钴= 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]

但我得到这个错误:'元组索引超出范围'。有什么问题吗?首先创建一个元组是不是效率不高?

您可以使用集合。柜台:

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一样使用它,并可以访问一些其他方法,如elements, most_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

最新更新