Подсписок, преобразующий многозначную строку в список из целых чисел - PullRequest
0 голосов
/ 17 января 2019

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

Оригинальный список:

# [[], ['0000000'], ['2200220'], ['2222220'], ['2200220'], ['2000020'], []]

Список голов:

# [[0, 0, 0, 0, 0, 0, 0], [2, 2, 0, 0, 2, 2, 0], [2, 2, 2, 2, 2, 2, 0], [2, 2, 0, 0, 2, 2, 0], [2, 0, 0, 0, 0, 2, 0]]

Следующая тема помогла мне зайти так далеко. Список списка, преобразование всех строк в int, Python 3

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

mylist = [[int(i) for i in s] for s in mylist]

# [[], [0], [2200220], [2222220], [2200220], [2000020], []]

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

import itertools

mylist = list(itertools.chain.from_iterable(mylist))

# ['0000000', '2200220', '2222220', '2200220', '2000020']

mylist_two = [[int(i) for i in str(s)] for s in mylist]

# [[0, 0, 0, 0, 0, 0, 0], [2, 2, 0, 0, 2, 2, 0], [2, 2, 2, 2, 2, 2, 0], [2, 2, 0, 0, 2, 2, 0], [2, 0, 0, 0, 0, 2, 0]]

Может ли кто-нибудь указать мне правильное направление? Спасибо.

Ответы [ 3 ]

0 голосов
/ 17 января 2019

Простой способ состоит в том, чтобы сгладить список с использованием понимания вложенного списка, а затем преобразовать каждый символ в строке в целое число.

Вот как вы можете изменить свой код:

mylist = [[], ['0000000'], ['2200220'], ['2222220'], ['2200220'], ['2000020'], []]
print([[int(z) for z in y] for x in mylist for y in x])
#[[0, 0, 0, 0, 0, 0, 0],
# [2, 2, 0, 0, 2, 2, 0],
# [2, 2, 2, 2, 2, 2, 0],
# [2, 2, 0, 0, 2, 2, 0],
# [2, 0, 0, 0, 0, 2, 0]]
0 голосов
/ 17 января 2019

Немного по-другому, учитывая, что каждый подсписок содержит только один элемент:

mylist = [[], ['0000000'], ['2200220'], ['2222220'], ['2200220'], ['2000020'], []]

[ [ int(ch) for ch in e[0] ] for e in mylist if len(e) > 0 ]

#=> [[0, 0, 0, 0, 0, 0, 0], [2, 2, 0, 0, 2, 2, 0], [2, 2, 2, 2, 2, 2, 0], [2, 2, 0, 0, 2, 2, 0], [2, 0, 0, 0, 0, 2, 0]]
0 голосов
/ 17 января 2019

Вы можете просто сделать:

data = [[], ['0000000'], ['2200220'], ['2222220'], ['2200220'], ['2000020'], []]
out = [list(map(int, list(s[0]))) for s in data if s ]
print(out)

# [[0, 0, 0, 0, 0, 0, 0], [2, 2, 0, 0, 2, 2, 0], [2, 2, 2, 2, 2, 2, 0], [2, 2, 0, 0, 2, 2, 0], [2, 0, 0, 0, 0, 2, 0]]out = [list(s[0]) for s in data if s ]

Поскольку строки повторяемы, list('123') создаст список путем итерации по отдельным символам '123', поэтому он вернет ['1', '2', '3']. Затем мы сопоставляем каждую отдельную цифру с целым числом.

...