这可能是一个重复的问题,但我想找出是否有办法解压缩列表并从解压缩的结果中创建变量?我在文件中有一个数据:
'[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 function giving incorrect output中描述的内容。
<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)))
答案 0 :(得分: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]
答案 1 :(得分:0)
让我们从原始输出开始(我只是手动创建字符串,但这相当于你的读取方法)
a = '[416213688, 422393399, 190690902, 81688],| [94925847, 61605626, 346027022],| [1035022, 1036527, 1038016]'
现在只是一个长字符串。让它成为一个字符串列表
a = a.split(',|')
我做了&#39;,&#39;而不只是&#39; |&#39;因为你也想摆脱逗号。
现在看起来像这样:
>>> ['[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]]