Существует ли более простой и эффективный способ хранения n значений, разделенных пробелом, в n разных списках? - PullRequest
0 голосов
/ 26 февраля 2020
i,j,k = map(int, sys.stdin.readline().split())
a.append(i)
b.append(j)
c.append(k)

Приведенный выше код работает нормально, но можем ли мы написать этот код более простым и эффективным способом? Я перебираю n строк с тремя целыми числами в каждой строке и хочу создать три отдельных списка для 1-го значения, 2-го значения и 3-го значения из каждой строки.

В Engli sh Я хочу сделать что-то вроде:

a.append (x), b.append (y) где x, y в sys.stdin.readline (). split ()

как В результате я хочу прочитать строку и добавить значения в отдельный список, чтобы при доступе к списку a [] он содержал первое значение каждой строки

Input:
1 2 3
4 5 6
7 8 9
10 11 12


Output:
a
>> [1, 4, 7, 10]
b
>> [2, 5, 8, 11]
c
>> [3, 6, 9, 12]

1 Ответ

0 голосов
/ 26 февраля 2020

Если вам нужно сделать это для многих строк, вы можете распаковать генератор, который преобразует все ваши строки в качестве аргументов в zip, который затем будет выдавать tuple первых элементов каждого строка, затем tuple элементов второй строки и т. д. c.

a, b, c = zip(*(map(int, line.split()) for line in f if line.strip()))

По существу, zip преобразует группу итераторов, которые производят "строки", в один итератор, который производит «колонны». Разделенная версия будет выглядеть так:

rows = (map(int, line.split()) for line in f if line.strip())
columns = zip(*rows)
a, b, c = columns

Если вы хотите, чтобы результат был list, а не tuple, вы можете дополнительно обернуть его в:

a, b, c = map(list, zip(*(map(int, line.split()) for line in f if line.strip())))

это становится довольно плотным в этой точке.

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