Python 元组列表的频率

Python 元组列表的频率,python,python-3.x,Python,Python 3.x,我有一份清单: a = [(['7', '8'], ['4', '7'],['3', '4'],['3', '8'],['4', '8'],...............['3','4'])] 我想创建两列,它们给出列表中元组的频率。例如: bigram frequency ['7','8'] 2 ['4','7'] 3 ['3', '4'] 6 等等 也要考虑条目,如代码> [7','8' ] < /代码>和 [8,' 7' ] < /代码>相同(重复)。只

我有一份清单:

a = [(['7', '8'], ['4', '7'],['3', '4'],['3', '8'],['4', '8'],...............['3','4'])]
我想创建两列,它们给出列表中元组的频率。例如:

bigram      frequency
['7','8']     2
['4','7']     3
['3', '4']    6
等等

也要考虑条目,如代码> [7','8' ] < /代码>和<代码> [8,' 7' ] < /代码>相同(重复)。只有一个条目应该在列中,频率应该添加到该列中

我试着用

from collections import counter
在上面做一些循环,但我得到的错误是:

不可损坏类型:列表


列表不能用作字典键,需要将它们转换为可哈希对象。在这种情况下,
tuple
是一个合适的选择:

In [5]: Counter(map(tuple, a[0])).items()
Out[5]: 
[(('4', '7'), 1),
 (('4', '8'), 1),
 (('7', '8'), 1),
 (('3', '4'), 2),
 (('3', '8'), 1)]

如果您想考虑unordle数组,则必须对它们进行排序,将它们传递给<代码>计数器< /代码>:

In [7]: a
Out[7]: 
[(['7', '8'],
  ['4', '7'],
  ['3', '4'],
  ['3', '8'],
  ['4', '8'],
  ['3', '4'],
  ['7', '4'])]

In [8]: Counter(tuple(sorted(i)) for i in a[0])
Out[8]: Counter({('4', '7'): 2, ('3', '4'): 2, ('3', '8'): 1, ('7', '8'): 1, ('4', '8'): 1})

注意由于数字是字符串,如果它们的长度超过一位数,则应在排序之前将其转换为整数,否则将按字典顺序进行排序。

列表不能用作字典键,因此需要将其转换为可哈希对象。在这种情况下,
tuple
是一个合适的选择:

In [5]: Counter(map(tuple, a[0])).items()
Out[5]: 
[(('4', '7'), 1),
 (('4', '8'), 1),
 (('7', '8'), 1),
 (('3', '4'), 2),
 (('3', '8'), 1)]

如果您想考虑unordle数组,则必须对它们进行排序,将它们传递给<代码>计数器< /代码>:

In [7]: a
Out[7]: 
[(['7', '8'],
  ['4', '7'],
  ['3', '4'],
  ['3', '8'],
  ['4', '8'],
  ['3', '4'],
  ['7', '4'])]

In [8]: Counter(tuple(sorted(i)) for i in a[0])
Out[8]: Counter({('4', '7'): 2, ('3', '4'): 2, ('3', '8'): 1, ('7', '8'): 1, ('4', '8'): 1})

注意由于数字是字符串,如果它们的长度超过一位数,则应在排序前将其转换为整数,否则将按字典顺序进行排序。

如果将列表更改为:
a=[('7','8'),…('4','7')]

或者可以将列表映射到元组,因为元组是可散列的,而不是列表

[更新]首先对列表进行排序,然后将每个列表映射到元组。
计数器(映射(lambda x:tuple(排序(x)),a[0])).items()
(基于@Kasramvd)。

如果将列表更改为:
a=[('7','8'),…('4','7')]

或者可以将列表映射到元组,因为元组是可散列的,而不是列表

[更新]首先对列表进行排序,然后将每个列表映射到元组。
计数器(map(lambda x:tuple(sorted(x)),a[0])).items()
(基于@Kasramvd)。

我想您可以使用
itertools.groupby
对已排序的项目列表进行分组。组的键可以是自定义键,它可以创建有序列表。对于二进制元组,可以使用简单的比较来创建这样的元组

考虑到

a = [(['7', '8'], ['4', '7'],['3', '4'],['3', '8'],['4', '8'],['4','3'])]


from itertools import groupby
key = lambda tup: tup if tup[0] < tup[1] else tup[::-1]
[(key,  len(list(values))) 
 for key, values in groupby(sorted(a[0], key = key), key = key)]
Out[42]: 
[(['3', '4'], 2),
 (['3', '8'], 1),
 (['4', '7'], 1),
 (['4', '8'], 1),
 (['7', '8'], 1)]

我想您可以使用
itertools.groupby
对已排序的项目列表进行分组。组的键可以是自定义键,它可以创建有序列表。对于二进制元组,可以使用简单的比较来创建这样的元组

考虑到

a = [(['7', '8'], ['4', '7'],['3', '4'],['3', '8'],['4', '8'],['4','3'])]


from itertools import groupby
key = lambda tup: tup if tup[0] < tup[1] else tup[::-1]
[(key,  len(list(values))) 
 for key, values in groupby(sorted(a[0], key = key), key = key)]
Out[42]: 
[(['3', '4'], 2),
 (['3', '8'], 1),
 (['4', '7'], 1),
 (['4', '8'], 1),
 (['7', '8'], 1)]
试试这个:

from collections import Counter

a = [(['7', '8'], ['4', '7'],['3', '4'],['3', '8'],['4', '8'],['3','4'],['7','8'],['8','7'],['4','3'])]

frequency_list = Counter(tuple(sorted(i)) for i in a[0])

print "bigram","frequency"
for key,val in frequency_list.items():
    print key, val
结果如下

bigram    frequency
('4', '7') 1
('4', '8') 1
('7', '8') 3
('3', '4') 3
('3', '8') 1
试试这个:

from collections import Counter

a = [(['7', '8'], ['4', '7'],['3', '4'],['3', '8'],['4', '8'],['3','4'],['7','8'],['8','7'],['4','3'])]

frequency_list = Counter(tuple(sorted(i)) for i in a[0])

print "bigram","frequency"
for key,val in frequency_list.items():
    print key, val
结果如下

bigram    frequency
('4', '7') 1
('4', '8') 1
('7', '8') 3
('3', '4') 3
('3', '8') 1


try:
计数器(在[0]中的i的元组(i))
因为您有一个包含第一个元素元组的列表,其中存在需要转换为的列表tuple@Mr.A是的,很好,谢谢,你能看看我对question@Mr.A考虑[7','8' ]和[8','7' ]相同的条目(重复)。只有一个条目应该在列中,频率应该添加到该列中。请尝试:
Counter(tuple(i)代表[0]中的i])
,因为您有一个包含第一个元素tuple的列表,其中存在需要转换为的列表tuple@Mr.A是的,很好,谢谢,你能看一下我对报纸的编辑吗question@Mr.A考虑[7','8' ]和[8','7' ]相同的条目(重复)。并且只有一个条目应该在列中,并且频率应该被加到那个。考虑像[7,'8′]和[8’,'7] ]相同的条目(重复)。只有一个条目应该在列中,频率应该被添加到列中。先生,它会删除重复条目吗,正如我所提到的?会的。您可以试一试:)
sorted
函数将把['8','7']列成['7','8'],元组(['7','8'])将得到('7','8')@Srnnn感谢,它只是我的代码的一部分,如果你能帮助我解决这个问题,考虑到[7','8' ]和[8','7' ]相同的条目(重复)将是非常有益的。只有一个条目应该在列中,频率应该被添加到列中。先生,它会删除重复条目吗,正如我所提到的?会的。您可以试一试:)
sorted
函数将把['8','7']列成['7','8'],元组(['7','8'])将得到('7','8')@Srnnn感谢,它只是我的代码的一部分,如果你能帮助我解决这个问题,考虑到[7','8' ]和[8','7' ]相同的条目(重复)将是非常有益的。感谢先生,这只是我代码的一部分,如果你能帮助我解决这个问题,那将非常有帮助。可能不需要先将它们转换为整数,因为
排序
函数是一致的,我们排序
[3,' 1 ',' 2 ' ] <代码> [1,' 2 ',' 3 ' ] < /> >或<代码> [1,' 3 ',' 2 ' ] < /代码>,只有在一致性得到保证的情况下,在最终输出中不存在重复。考虑[7','8' ]和[8,' 7' ]相同的条目(重复)。并且只有一个条目应该在列中,频率应该被添加到该列中。谢谢,先生,这只是我代码的一部分,如果您能帮助我解决这个问题,它将非常有用。可能不必首先将它们转换为整数,因为
排序
函数是一致的,我们排序
['3','1','2']
['1','2','3']
['1','3','2']
,只有在能够保证一致性的情况下,最终输出中才不会存在重复项。主席先生,它会删除我的重复项吗?例如[7,8]和[8,7]是相同的,从列表中删除[8,7],但在[7,8]中增加了频率谢谢,先生,这只是我代码的一部分,如果你能帮助我解决这个问题,这将对解决这个问题非常有帮助