Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从txt文件制作3D列表?python_Python_List - Fatal编程技术网

如何从txt文件制作3D列表?python

如何从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']] ] (我把它隔开一点,以便更容易看到!) 我原

我已经坚持了将近三天了,我尝试了很多不同的方法,但都没有成功

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']] ]
(我把它隔开一点,以便更容易看到!)

我原以为这类似于制作一个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