列表中的Python计数列表

列表中的Python计数列表,python,Python,我有以下清单: data = [('A', 'B'), ('C','D'), ('E','F'), ('G','H'), ('B','A'), ('D','C')] 第一个和第二个元素的顺序并不重要,因此,例如,“A”、“B”和“B”、“A”被视为相同的。预期的结果将是: ('A','B') 2 ('C','D') 2 ('E','F') 1 ('G','H') 1 我尝试了以下改编: 结果如下所示: ('G', 'H') 1 ('B', 'A') 1 ('E', 'F') 1 ('A',

我有以下清单:

data = [('A', 'B'), ('C','D'), ('E','F'), ('G','H'), ('B','A'), ('D','C')]
第一个和第二个元素的顺序并不重要,因此,例如,“A”、“B”和“B”、“A”被视为相同的。预期的结果将是:

('A','B') 2
('C','D') 2
('E','F') 1
('G','H') 1
我尝试了以下改编:

结果如下所示:

('G', 'H') 1
('B', 'A') 1
('E', 'F') 1
('A', 'B') 1
('D', 'C') 1
('C', 'D') 1
from collections import Counter
data = [('A', 'B'), ('C','D'), ('E','F'), ('G','H'), ('B','A'), ('D','C')]
data = [Counter(x) for x in data]
print Counter([", ".join(list(x.elements())) for x in data]).most_common()

有什么建议吗?

解决这个问题的一种方法是迭代每个元组,并使用sorted按字母顺序排列。因此,B、A将变成A、B等。然后,您可以继续使用之前编写的代码来计算发生的次数

from collections import Counter

data = [('A', 'B'), ('C','D'), ('E','F'), ('G','H'), ('B','A'), ('D','C')]

data = [tuple(sorted(item)) for item in data]  # sorts each tuple alphabetically

for i, j in Counter(data).most_common():
    print(i, j)
或者不使用列表理解和Python 2.x语法:

from collections import Counter

data = [('A', 'B'), ('C','D'), ('E','F'), ('G','H'), ('B','A'), ('D','C')]

for i in range(0, len(data)):
    data[i] = tuple(sorted(data[i]))

for i, j in Counter(data).most_common():
    print i, j

解决这个问题的一种方法是迭代每个元组,并使用sorted按字母顺序对它们排序。因此,B、A将变成A、B等。然后,您可以继续使用之前编写的代码来计算发生的次数

from collections import Counter

data = [('A', 'B'), ('C','D'), ('E','F'), ('G','H'), ('B','A'), ('D','C')]

data = [tuple(sorted(item)) for item in data]  # sorts each tuple alphabetically

for i, j in Counter(data).most_common():
    print(i, j)
或者不使用列表理解和Python 2.x语法:

from collections import Counter

data = [('A', 'B'), ('C','D'), ('E','F'), ('G','H'), ('B','A'), ('D','C')]

for i in range(0, len(data)):
    data[i] = tuple(sorted(data[i]))

for i, j in Counter(data).most_common():
    print i, j

一种方法是计算内部元组的计数器,如下所示:

('G', 'H') 1
('B', 'A') 1
('E', 'F') 1
('A', 'B') 1
('D', 'C') 1
('C', 'D') 1
from collections import Counter
data = [('A', 'B'), ('C','D'), ('E','F'), ('G','H'), ('B','A'), ('D','C')]
data = [Counter(x) for x in data]
print Counter([", ".join(list(x.elements())) for x in data]).most_common()

一种方法是计算内部元组的计数器,如下所示:

('G', 'H') 1
('B', 'A') 1
('E', 'F') 1
('A', 'B') 1
('D', 'C') 1
('C', 'D') 1
from collections import Counter
data = [('A', 'B'), ('C','D'), ('E','F'), ('G','H'), ('B','A'), ('D','C')]
data = [Counter(x) for x in data]
print Counter([", ".join(list(x.elements())) for x in data]).most_common()

如果出于某种原因,您不想使用计数器

data_dict = {}
for d in data:
    temp_d = tuple(sorted(d))
    if temp_d in data_dict:
        data_dict[temp_d] += 1
    else:
        data_dict[temp_d] = 1
输出

{('A', 'B'): 2, ('C', 'D'): 2, ('E', 'F'): 1, ('G', 'H'): 1}
如果你用熊猫呢

import pandas as pd
pd.Series(data).map(lambda x: tuple(sorted(x))).value_counts()
输出

(C, D)    2
(A, B)    2
(G, H)    1
(E, F)    1
dtype: int64

如果出于某种原因,您不想使用计数器

data_dict = {}
for d in data:
    temp_d = tuple(sorted(d))
    if temp_d in data_dict:
        data_dict[temp_d] += 1
    else:
        data_dict[temp_d] = 1
输出

{('A', 'B'): 2, ('C', 'D'): 2, ('E', 'F'): 1, ('G', 'H'): 1}
如果你用熊猫呢

import pandas as pd
pd.Series(data).map(lambda x: tuple(sorted(x))).value_counts()
输出

(C, D)    2
(A, B)    2
(G, H)    1
(E, F)    1
dtype: int64

你必须在清点之前把它们分类

数据=['A','B','C','D','E','F','G','H','B','A','D','C'] def计数: 排序的_数据=[数据中d的tuplesortedd] 对于反排序数据中的i,j。最常见的: 普林蒂,j
你必须在清点之前把它们分类

数据=['A','B','C','D','E','F','G','H','B','A','D','C'] def计数: 排序的_数据=[数据中d的tuplesortedd] 对于反排序数据中的i,j。最常见的: 普林蒂,j tuple不是适合您的用例的最佳类型。考虑使用SET,

比如说,

(1, 2) == (2, 1)    # False
{1, 2} == {2, 1}    # True
tuple不是适合您的用例的最佳类型。考虑使用SET,

比如说,

(1, 2) == (2, 1)    # False
{1, 2} == {2, 1}    # True

无需加载计数器模块的简单解决方案:

输出:

{('C', 'D'): 2, ('G', 'H'): 1, ('E', 'F'): 1, ('A', 'B'): 2}

无需加载计数器模块的简单解决方案:

输出:

{('C', 'D'): 2, ('G', 'H'): 1, ('E', 'F'): 1, ('A', 'B'): 2}
试试熊猫

import pandas as pd
pd.Series(pd.Series([('a','b'),('b','a'),('c','d')]).apply(lambda x: tuple(sorted(list(x))))).value_counts()

#output
(a, b)    2
(c, d)    1
dtype: int64
试试熊猫

import pandas as pd
pd.Series(pd.Series([('a','b'),('b','a'),('c','d')]).apply(lambda x: tuple(sorted(list(x))))).value_counts()

#output
(a, b)    2
(c, d)    1
dtype: int64

每个元组中是否总是只有两个项?是的。每个元组中有两个项。例如,您可以调整此项以使用计数器。或者只是mapfrozenset,data。计算每个列表中出现的字母数作为中间步骤。每个元组中是否始终只有两个项目?是的。每个元组中有两个项。例如,您可以调整此项以使用计数器。或者只是mapfrozenset,data。计算每个列表中出现的字母数作为中间步骤。糟糕的解决方案会浪费计算时间。我不这么认为。说到计算时间,如果你不知道自己到底在寻找什么,那就太可笑了。请下次再好好看看:问这个问题的凯文最后选择了一个和我建议的完全相同的解决方案。糟糕的解决方案浪费了计算时间。我不这么认为。说到计算时间,如果你不知道自己到底在寻找什么,那就太可笑了。请下次再好好看看:问这个问题的凯文最后选择了一个与我建议的完全相同的解决方案。