Однострочное разделение и отображение в рамках понимания списка

У меня есть этот бит для анализа вывода из стандартного вывода:

out_lines = res.stdout.split("\n")
out_lines = [e.split() for e in out_lines]
out_vals = [{"date":e[0],
             "time":e[1],
             "size":e[2],
             "name":e[3]} for e in out_lines if e]

Есть ли здесь идиоматический способ объединить вторую и третью строки, чтобы разделение и сопоставление происходило внутри одной строки, без избыточных вызовов e.split()?

Возможно, вы сможете сделать это, используя оператор моржа для хранения результатов e.split(), но это будет некрасиво.

Barmar 25.06.2024 23:54

Я бы пошел другим путем и добавил вспомогательную функцию (например, my_obj_from_line), которая выполнила бы разделение и создала новый объект.

Lesiak 26.06.2024 00:12
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
2
68
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

[{"date": e[0], "time": e[1], "size": e[2], "name": e[3]} for e in (line.split() for line in sample_stdout.split("\n")) if e]

Вы можете использовать zip, чтобы соединить ключи со словами, а затем передать это конструктору dict.

Тогда, если split() приведет к появлению пустого списка, вы получите пустые объекты, которые можно будет отфильтровать позже:

out_vals = list(filter(None, (
    dict(zip(("date", "time", "size", "name"), line.split()))
    for line in res.stdout.split("\n")
)))

Небольшая модификация подхода Тринкота: выделение line.split() путем привязки имени data к одноэлементному кортежу и использование if line.strip() для обращения к пустым строкам, а не использование filter после этого.

[
  dict(zip(("date", "time", "size", "name"), data))
  for line in text.splitlines()
  if line.strip()
  for data in (line.split(),)
]
Ответ принят как подходящий

Ответ @trincot работает, но можно избежать фильтра постобработки, сопоставив строки с str.split, чтобы вместо этого фильтрацию можно было выполнить с помощью предложения if понимания:

out_vals = [
    dict(zip(("date", "time", "size", "name"), e))
    for e in map(str.split, res.stdout.split("\n")) if e
]

Другие вопросы по теме