我有以下列表:
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
有什么建议吗?
答案 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)