Мне нужно определить наиболее часто встречающийся символ списка строк по каждому индексу в Python.
Пример
list1 = ['один', 'два', 'близнец', 'кто']
наиболее часто встречающийся символ между всеми строками с индексом 0 - это 't' наиболее часто встречающийся символ между всеми строками в индексе 1 — «w» наиболее часто встречающийся символ между всеми строками в индексе 2 — «о» наиболее частым символом между всеми строками с индексом 3 является «n» (потому что в индексе 3 есть только один символ).
из этого я хочу создать окончательную строку 'twon', которая показывает наиболее частый символ всех строк по каждому индексу.
как я могу выполнить это на python без импорта какой-либо библиотеки? спасибо
from collections import Counter
list1 = ['one', 'two', 'twin', 'who']
idx =0 #t
print(Counter(list(zip(*[i for i in list1 if len(i)>3]))[idx]).most_common()[0][0])
без импорта каких-либо библиотек
list1 = ['one', 'two', 'twin', 'who']
idx =0 #t
l = list(list(zip(*[i for i in list1 if len(i)>3]))[idx])
print(max(set(l), key = l.count))
Есть проблема с zip
: он считает, что все элементы имеют одинаковую длину. поэтому для индекса 3 это не удается
да, это работает только для первых трех индексов, в последнем индексе написано «IndexError: индекс списка вне диапазона»
может быть, с помощью словаря?
@HamidRasti ты прав, я изменил свой ответ
from itertools import zip_longest
list1 = ['one', 'two', 'twin', 'who']
chars = {}
for i, item in enumerate(zip_longest(*list1)):
set1 = set(item)
if None in set1:
set1.remove(None)
chars[i] = max(set1, key=item.count)
Без импорта какой-либо библиотеки:
list1 = ['one', 'two', 'twin', 'who']
width = len(max(list1, key=len))
chars = {}
for i, item in enumerate(zip(*[s.ljust(width) for s in list1])):
set1 = set(item)
if ' ' in set1:
set1.remove(' ')
chars[i] = max(set1, key=item.count)
Вывод:
chars
{
0: 't',
1: 'w',
2: 'o',
3: 'n'
}
"".join(chars.values())
'twon'
Как я могу сделать то же самое без импорта какой-либо библиотеки? спасибо
@nuovo2000ita Я добавил версию without importing
!
Вы также можете использовать исходное решение с for i, item in enumerate(zip(*[s.ljust(width) for s in list1])):
, с width = max(len(s) for s in list1
), а затем заменить None
на " "
.
@ Тимус Хорошая идея! Я отредактировал свой код. кроме того, мы можем использовать map
вместо понимания списка, например: map(lambda s: s.ljust(width), list1)
этот метод выглядит великолепно, я просто хотел бы ускорить его выполнение. Должен ли я что-то изменить в коде, который вы разместили в решении? спасибо
@nuovo2000ita Вы можете использовать map without lambda!
вместо list comprehension
. это может быть быстрее: понимание списка против карты
как бы вы написали код без лямбды в приведенном выше примере?
Мне нужно время и получить некоторые тесты из кода. но, основываясь на этом ответе SO: вы можете заменить zip(*[s.ljust(width) for s in list1])
на zip(*map(lambda s: s.ljust(width), list1))
и улучшить время выполнения. @nuovo2000ita
Пожалуйста, поделитесь кодом, с которым вы пробовали, тогда мы сможем помочь вам устранить любые проблемы, которые могут возникнуть у вас.