如何从txt文件制作3D列表?python
我已经坚持了将近三天了,我尝试了很多不同的方法,但都没有成功 txt文件(num.txt)如下所示:如何从txt文件制作3D列表?python,python,list,Python,List,我已经坚持了将近三天了,我尝试了很多不同的方法,但都没有成功 txt文件(num.txt)如下所示: 1234 4321 3214 3321 4421 2341 如何将此文件放入由2行3列组成的3D列表中 我试图实现的输出是: [ [['1','2','3','4']['4','3','2','1']['3','2','1','4']], [['3','3','2','1']['4','4','2','1']['2','3','4','1']] ] (我把它隔开一点,以便更容易看到!) 我原
1234
4321
3214
3321
4421
2341
如何将此文件放入由2行3列组成的3D列表中
我试图实现的输出是:
[ [['1','2','3','4']['4','3','2','1']['3','2','1','4']], [['3','3','2','1']['4','4','2','1']['2','3','4','1']] ]
(我把它隔开一点,以便更容易看到!)
我原以为这类似于制作一个2D列表,但我尝试了什么都没用!有人能帮忙吗
谢谢大家! 您必须打开文件并键入cast,将每行字符串转换为
列表
,如:
my_list = []
sublist_size = 3
with open('/path/to/num.txt') as f:
file_lines = list(f)
for i in range(0, len(file_lines), sublist_size):
my_list.append([list(line.rstrip()) for line in file_lines[i:i+sublist_size]])
# ^ Remove `\n` from right of each line
此处my_list
将保存您想要的值:
[[['1','2','3','4']['4','3','2','1']['3','2','1','4']],
[['3','3','2','1']['4','4','2','1']['2','3','4','1']]]
这里有一个非常简单的方法,可以通过一些简单的算法来实现:
with open('num.txt') as infile: # open file
answer = []
for i,line in enumerate(infile): # get the line number (starting at 0) and the actual line
if not i%3: answer.append([])
answer[-1].append(list(line.strip()))
使用
range()
函数和简单列表理解的解决方案:
输出:
[[['1', '2', '3', '4'], ['4', '3', '2', '1'], ['3', '2', '1', '4']], [['3', '3', '2', '1'], ['4', '4', '2', '1'], ['2', '3', '4', '1']]]
另一个我认为更清晰且不需要将整个文件加载到内存中的选项:
inner_size = 3
inner_range = range(inner_size) # precompute this since we'll be using it a lot
with open('/home/user/nums.txt') as f:
result = []
try:
while True:
subarr = []
for _ in inner_range:
subarr.append(list(f.next().rstrip()))
result.append(subarr)
except StopIteration:
pass
使用file对象上的内置\uuuu iter\uuu
,我们构建子数组并将它们附加到结果数组中,并使用StopIteration
异常来知道我们完成了,丢弃任何额外的数据。如果要在末尾保留任何部分subar,可以在异常中轻松地if subar:result.append(subar)
作为列表理解编写(尽管无法恢复任何最终、部分子列表):
别忘了从每行
末尾.strip()
开始'\n'
否,至少在Python 2.7中是这样,换行符包含在每个行中
是不必要的,事实上会使处理陷入停滞->对于f中的行
就足够了,因为它将文件视为迭代器并将其作为needed@TemporalWolf:谢谢你的信息。更新了它。事实上,我不需要readlines()
是不必要的,并且会减慢进程,因为它读取整个文件并在返回之前对其进行解析返回一个迭代器,该迭代器根据需要返回行。@TemporalWolf,好的,删除该迭代器。感谢hintIt值得一提的一点,对于足够大的文件,这种方法几乎是强制性的,因为它不需要将整个文件加载到内存中。@TemporalWolf:这是有争议的,除非您想让生成器产生每三行,因为answer
无论如何都会增长以容纳整个文件。如果OP真的需要一个文件行的三元组列表,那么在answer
中使用元组而不是列表可能会有帮助(非常轻微),以节省空间。其他两个答案都需要在处理整个文件之前加载整个文件。您的解决方案可用于定期保存结果,从而处理无法完全保存在内存中的文件。这使用了两个迭代器和python的智能文件缓冲区。
inner_size = 3
inner_range = range(inner_size) # precompute this since we'll be using it a lot
with open('/home/user/nums.txt') as f:
result = []
try:
while True:
subarr = []
for _ in inner_range:
subarr.append(list(f.next().rstrip()))
result.append(subarr)
except StopIteration:
pass
inner_size = 3
inner_range = range(inner_size)
with open('/home/user/nums.txt') as f:
result = []
try:
while True:
result.append([list(f.next().rstrip()) for _ in inner_range])
except StopIteration:
pass