计算嵌套列表中的唯一元组

时间:2019-03-29 13:55:55

标签: python arrays list dictionary

我有一个2D数组,其中每个元素都是一对两个标记,例如[“ NOUN”,“ VERB”],并且我想计算每个唯一对在大型数据集中出现的次数。 / p>

到目前为止,我已经尝试使用defaultdict(int)和Counter()轻松地添加元素(如果以前未找到),或者如果找到则将值增加1。

dTransition = Counter()
# dTransition = defaultdict(int)

# <s> is a start of sentence tag
pairs = [[('<s>', 'NOUN')], [('CCONJ', 'NOUN')], [('NOUN', 'SCONJ')], [('SCONJ', 'NOUN')]]

for pair in pairs:
      dTransition[pairs] += 1

这不起作用,因为它不接受两个参数。因此,我想知道是否存在一种简单的方法来检查字典,如果已经存在作为2D数组的键,如果存在,则将值增加1。

3 个答案:

答案 0 :(得分:4)

您需要使列表变平,因为与列表不同,元组是可哈希的。一个简单的选择是使用itertools.chain,然后使用元组列表构建Counter

from itertools import chain
Counter(chain(*pairs))

输出

Counter({('<s>', 'NOUN'): 1, ('CCONJ', 'NOUN'): 1, 
         ('NOUN', 'SCONJ'): 1, ('SCONJ', 'NOUN'): 1})

答案 1 :(得分:1)

您可以使用numpy数组通过已内置的函数执行此操作。

xl_file = pd.ExcelFile('C:/Users/e877780/Desktop/DEV/S2_SK_S_06_02_input.xlsx')
sheet1=xl_file.parse("S.06.02")
spread=sheet1[['C0040','C0090','C0170','C0290','C0340','C0360']]
spread['idx']=range(1,len(spread)+1)
spread.set_index('idx', inplace=True)
C0900=[]
for i in range(1, len(spread)+1):
    C0900.append(int(spread.loc[i]["C0340"][:1])
spread['C0900']=C0900

答案 2 :(得分:0)

您使用defaultdict的解决方案是正确的,但是您必须插入两个值作为字典关键字的元组。在您的示例中,元组始终是列表的第一个元素:

import collections 
dTransition = collections.defaultdict(int)

# <s> is a start of sentence tag
pairs = [[('<s>', 'NOUN')], [('CCONJ', 'NOUN')], [('NOUN', 'SCONJ')], [('SCONJ', 'NOUN')],[('SCONJ', 'NOUN')]]

for pair in pairs:
      dTransition[pair[0]] += 1

然后它起作用