Python пока l oop вернуть N-ую букву - PullRequest
4 голосов
/ 06 января 2020

У меня есть список строк

X=['kmo','catlin','mept']

Я пытался написать al oop, который бы возвращал список, содержащий списки каждой N-й буквы каждого слова:

[['k','c','m'], ['m','a','e'],['o','t','p']]

Но все методы, которые я попробовал, возвращали только список всех букв, возвращаемых последовательно в одном списке:

['k','m','o','c','a','t','l','i'.....'t'] 

Вот одна версия моего кода:

def letters(X):
    prefix=[]
    for i in X:
      j=0
      while j < len(i):
        while j < len(i):
          prefix.append(i[j])
          break
        j+=1
    return prefix

Я знаю Я зацикливаюсь на каждом слове, но не знаю, как его исправить.

Ответы [ 4 ]

7 голосов
/ 06 января 2020

Кажется, что длина результирующего списка определяется длиной наименьшей строки в исходном списке. Если это действительно так, вы можете просто сделать это так:

X = ['kmo','catlin','mept']

l = len(min(X, key=len))

res = [[x[i] for x in X] for i in range(l)]

, что возвращает:

print(res)  # -> [['k', 'c', 'm'], ['m', 'a', 'e'], ['o', 't', 'p']]

или еще проще (kudos @JonClemens):

res = [list(el) for el in zip(*X)]

с тем же результатом. Обратите внимание, что это работает, потому что zip автоматически прекращает итерацию, как только один из его элементов истощается.


Если вы хотите заполнить пробелы так сказать, itertools получил вашу спину с помощью zip_longest метода. См. this для получения дополнительной информации. fillvalue может быть чем угодно; здесь '-' используется для демонстрации использования. Пустая строка '' может быть лучшим вариантом для производственного кода .

res = list(zip_longest(*X, fillvalue = '-'))
print(res)  # -> [('k', 'c', 'm'), ('m', 'a', 'e'), ('o', 't', 'p'), ('-', 'l', 't'), ('-', 'i', '-'), ('-', 'n', '-')]
4 голосов
/ 06 января 2020

Вы можете использовать zip.

output=list(zip(*X))
print(output)

*X распакует все элементы, присутствующие в X.

После распаковки я упаковал все их вместе. Функция zip() возвращает объект zip , который является итератором из кортежей , где первый элемент в каждом переданном итераторе соединен вместе, а затем второй элементы в каждом переданном итераторе соединены вместе и т. д. c. Наконец, я завернул все в список, используя list.


output

[('k', 'c', 'm'), ('m', 'a', 'e'), ('o', 't', 'p')]

Если вы хотите, чтобы output был списком списков. Затем используйте map.

output=list(map(list,zip(*X)))
print(output)

output

[['k', 'c', 'm'], ['m', 'a', 'e'], ['o', 't', 'p']]
0 голосов
/ 06 января 2020
X=['kmo','catlin','mept']
y = []
j=0

for i in X:
    item =''
    for element in X :

        if (len(element) > j):
            item = item + element[j]


    y.append(item)
    j=j+1
print("X = [",X,"]")
print("Y = [",y,"]")

result

0 голосов
/ 06 января 2020

попробуйте

def letters(X):
    prefix=[]
    # First lets zip the list element
    zip_elemets =  zip(*X)

    for element in zip_elemets:
        prefix.append(list(element))

    return prefix
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...