列表中的Python计数列表

时间:2016-12-24 23:07:06

标签: 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

我试过这个(改编自How to count number of duplicates in a list of tuples?):

data = [('A', 'B'), ('C','D'), ('E','F'), ('G','H'), ('B','A'), ('D','C')]
from collections import Counter 
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

有什么建议吗?

7 个答案:

答案 0 :(得分:2)

解决此问题的一种方法是迭代每个元组,并使用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

答案 1 :(得分: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()

答案 2 :(得分:1)

如果由于某种原因你不想使用Counter

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}

如果你使用pandas

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

答案 3 :(得分:1)

tuple不是您用例的最佳类型。请考虑改为使用set

例如,

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

答案 4 :(得分:1)

无需加载Counter模块的简单解决方案:

data = [('A', 'B'), ('C','D'), ('E','F'), ('G','H'), ('B','A'), ('D','C')]
counts = {}
for t in data:
    k = tuple(sorted(t))
    counts[k] = counts.get(k, 0) + 1

print(counts)

输出:

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

答案 5 :(得分:1)

尝试使用熊猫。 :)

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

答案 6 :(得分:0)

你必须在计算之前对它们进行排序。

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

def count():
    sorted_data = [tuple(sorted(d)) for d in data]
    for i, j in Counter(sorted_data).most_common():
        print(i, j)