0

这可能是一个重复的问题,但我想知道有没有办法解压缩列表列表并从解压缩的结果中创建一个变量?我在文件中有一个数据,例如:

'[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)))
4

2 回答 2

1

这是将字符串解析为二维网格的一种快速而肮脏的方法(即:一个列表,它本身包含一个整数列表):

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]
于 2017-09-10T23:23:51.367 回答
0

让我们从原始输出开始(我只是手动制作字符串,但这相当于您的 read 方法)

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's it 中,并将它们放入一个列表中。

这应该返回您想要的代码。

[[416213688, 422393399, 190690902, 81688], [94925847, 61605626, 346027022], [1035022, 1036527, 1038016]]
于 2017-09-10T23:30:52.200 回答