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]

但我收到此错误:“元组索引超出范围”。问题是什么?首先制作一个元组可能效率不高吗?

4

1 回答 1

7

您可以使用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.Counter是 的子类dict。因此,您通常dict可以像使用.elementsmost_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)       

但是,dicts 有一个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
于 2013-02-27T11:16:38.243 回答