Как распаковать список списков?

Это может быть повторяющийся вопрос, но я хочу узнать, есть ли способ распаковать список списков и сделать переменную из распакованного результата? У меня есть данные в файле, например:

'[416213688, 422393399, 190690902, 81688],| [94925847, 61605626, 346027022],| [1035022, 1036527, 1038016]'

Итак, я открываю файл и составляю список

with open ('data.txt', "r") as f:
   a = f.read()
a = a.split("|")
print(*a)

Выход:

[416213688, 422393399, 190690902, 81688], [94925847, 61605626, 346027022], [1035022, 1036527, 1038016]

Это результат, который мне нужен для следующего шага моей программы. Но я не могу сделать этот результат a переменной для дальнейшего использования. Это дает мне SyntaxError: can't use starred expression here, если я попытаюсь:

a = (*a) 

Я попытался сделать это с помощью zip, но это дает мне неправильный вывод, аналогичный тому, что описано в вопросе функция zip дает неправильный вывод.

<zip object at 0x0000000001C86108>

Итак, есть ли способ распаковать список списка и получить вывод, например:

[1st list of variables], [2nd  list of variables], [etc...]

если я использую itertools, я получаю:

   l = list(chain(*a))
   Out: ['[', '4', '1', '6', '2', '1', '3', '6'...

это не требуется

Таким образом, рабочий вариант https://stackoverflow.com/a/46146432/8589220:

 row_strings = a.split(",| ")
 grid = [[int(s) for s in row[1:-1].split(", ")] for row in row_strings]
 print(",".join(map(str, grid)))

person NagaevAF    schedule 10.09.2017    source источник
comment
Вы можете попробовать понимание списка, например [x для l в списке для x в l].   -  person Fady Saad    schedule 11.09.2017
comment
Zip не дает «неверный вывод», возможно, вы используете его неправильно. Также неясно, чего именно вы пытаетесь достичь - ваши данные находятся в переменной, и эта переменная содержит список списков.   -  person pvg    schedule 11.09.2017
comment
Вы можете использовать itertools.chain: from itertools import chain; l = list(chain(*a)).   -  person Christian Dean    schedule 11.09.2017
comment
Вы ищете json.loads?   -  person Ry-♦    schedule 11.09.2017
comment
Что ты пытаешься сделать? split() возвращает список. Поэтому вызов a = list(a) является излишним. Должна ли эта распакованная переменная быть итерируемой или одной строкой строк/целых/символов?   -  person pstatix    schedule 11.09.2017
comment
Я не понимаю, чего вы ожидаете от a = (*a); и, как уже отмечалось, a = list(a) является избыточным в этой точке программы. Это смутно похоже на то, что вы на самом деле пытаетесь сделать, это взять строку типа "[1, 2, 3]" и преобразовать ее в список [1, 2, 3]. Это оно?   -  person Karl Knechtel    schedule 11.09.2017


Ответы (2)


Вот быстрый и грязный способ разобрать строку в двумерную сетку (то есть: список, который сам содержит список целых чисел):

row_strings = a.split(",| ")
grid = [[int(s) for s in row[1:-1].split(", ")] for row in row_strings]
print("\n".join(map(str, grid)))
# Out:
# [416213688, 422393399, 190690902, 81688]
# [94925847, 61605626, 346027022]
# [1035022, 1036527, 1038016]
person Adriano    schedule 10.09.2017

Давайте начнем с необработанного вывода (я просто вручную создам строку, но это эквивалентно вашему методу чтения)

a = '[416213688, 422393399, 190690902, 81688],| [94925847, 61605626, 346027022],| [1035022, 1036527, 1038016]'

Теперь это всего лишь одна длинная строка. Давайте сделаем это списком строк

a = a.split(',|')

Я сделал ', |' вместо просто '|' потому что вы тоже захотите избавиться от запятой.

Теперь а выглядит так:

>>> ['[416213688, 422393399, 190690902, 81688]', ' [94925847, 61605626, 346027022]', ' [1035022, 1036527, 1038016]']

Это список строк, которые выглядят как массивы. Давайте превратим эти строки в массивы целых чисел. Один из способов сделать это — использовать ast.literal_eval(). . Что он делает, так это принимает строку в качестве аргумента и пытается интерпретировать все, что находится в этой строке, как литерал Python. Ему не нравятся начальные пробелы, поэтому мы сначала удаляем их с помощью .strip().

import ast
a = [ast.literal_eval(arr.strip()) for arr in a]

Что это делает, так это то, что он берет каждую строку в a, literal_eval, и помещает их в список.

Это должно вернуть код, который вы хотите.

[[416213688, 422393399, 190690902, 81688], [94925847, 61605626, 346027022], [1035022, 1036527, 1038016]]
person Jared Jensen    schedule 10.09.2017