Python - подсчет наиболее часто встречающихся элементов в списке одинаковой длины - PullRequest
0 голосов
/ 27 февраля 2019

Я искал ответы на эти вопросы в течение последних нескольких часов, но не нашел ответа, который искал, поэтому решил вместо этого спросить здесь.

Итак, скажем, у меня есть списокданных такой же длины, как;

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

Какой самый эффективный способ сопоставления наиболее часто встречающихся символов в каждой позиции.

Пример вывода будет выглядеть примерно так:

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

Изменить: Спасибо за ответы, дал мне именно то, что я искал!:)

Редактировать 2: мысль я бы добавил к вопросу, так как это может быть самый простой способ выяснить это.С предложенными ответами, как бы вы добавили общее количество, а также какой-то процент?Поскольку это большой набор данных, одни наиболее распространенные случаи не так ясны, как я надеялся, что это было бы.

Ответы [ 5 ]

0 голосов
/ 27 февраля 2019

Поскольку никто не использовал панд, с помощью 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
"""
0 голосов
/ 27 февраля 2019

Без импорта я бы сделал:

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']
0 голосов
/ 27 февраля 2019
from collections import Counter
''.join(Counter(i).most_common(1)[0][0] for i in zip(*l))

Где l - ваш список строк.

0 голосов
/ 27 февраля 2019

zip список строк, чтобы «транспонировать» их для представления столбцов в том же итераторе, применить к ним 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))

0 голосов
/ 27 февраля 2019

Вы начинаете использовать 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'
...