Python-计算相同长度列表中最频繁的元素

时间:2019-02-27 11:52:27

标签: python string frequency

在过去的几个小时中,我一直在寻找答案,但是没有找到我想要的答案,所以我决定在这里询问。

所以,说我有一个长度相同的数据列表,例如;

0004000000350
0000090033313
0004000604363
040006203330b
0004000300a3a
0004000403833
00000300333a9
0004000003a30

匹配每个位置上出现次数最多的字符的最有效方法是什么。

输出示例如下:

0 0 0 4 0 0 0 0 0 3 3 3 3



编辑:感谢您的回答,给了我我所要的! :)



编辑2:我想补充一下这个问题,因为这可能是解决问题的最简单方法。有了建议的答案,您将如何增加总数,以及某种百分比?由于数据量很大,因此仅最常见的情况并没有我希望的那么清楚。

5 个答案:

答案 0 :(得分:2)

您开始使用zip来插入每个相对位置相同的字符串中的字符。然后使用scipy.stats.mode采用每个元组的模式,将生成器表达式中的结果字符串连接起来:

l = ['0004000000350', '0000090033313', '0004000604363', '040006203330b', 
     '0004000300a3a', '0004000403833', '00000300333a9', '0004000003a30']

from scipy.stats import mode
''.join(mode(i).mode[0] for i in list(zip(*l)))

输出

'0004000003333'

答案 1 :(得分:2)

压缩字符串列表以“转置”它们以在同一迭代器中显示列,对它们应用collections.Counter,然后使用most_common方法,删除不需要的数据

data="""0004000000350
0000090033313
0004000604363
040006203330b
0004000300a3a
0004000403833
00000300333a9
0004000003a30"""

import collections

counts = [collections.Counter(x).most_common(1)[0][0] for x in zip(*data.splitlines())]

这将产生:

['0', '0', '0', '4', '0', '0', '0', '0', '0', '3', '3', '3', '3']

(如果需要,请使用"".join(counts)连接字符以重新创建字符串)

答案 2 :(得分:0)

from collections import Counter
''.join(Counter(i).most_common(1)[0][0] for i in zip(*l))

l是您的字符串列表。

答案 3 :(得分:0)

如果没有导入,我会这样做:

data = [
"0004000000350",
"0000090033313",
"0004000604363",
"040006203330b",
"0004000300a3a",
"0004000403833",
"00000300333a9",
"0004000003a30",
]

# return the most common elemebt in an iterable
most_common = lambda ite: max(ite, key=ite.count)  

# print the most_common in each columns
print(map(most_common, zip(*data)))

# ['0', '0', '0', '4', '0', '0', '0', '0', '0', '3', '3', '3', '3']

答案 4 :(得分:0)

由于没有人使用过熊猫,因此使用pandas可以轻松而有效地实现

a = """0004000000350
0000090033313
0004000604363
040006203330b
0004000300a3a
0004000403833
00000300333a9
0004000003a30"""

import pandas as pd
df = pd.DataFrame([list(j) for j in a.strip().split('\n')])
result =  df.mode().to_string(header=None,index=None)
print(result)

""" output 
 0  0  0  4  0  0  0  0  0  3  3  3  3
"""