Python - 将字符串导入列表,导入另一个列表:)

时间:2013-12-22 14:43:21

标签: python python-3.x

基本上我想从文本文件中读取字符串,将它们放在三个列表中,然后将三个列表中的所有三个放入另一个列表中。其实让我更好地解释一下:)

文本文件(只是一个例子,我可以根据需要构建它):

party    
sleep  
study    
--------   
party   
sleep  
sleep    
-----   
study  
sleep  
party   
---------

由此,我希望Python创建一个如下所示的列表:

List1 = [['party','sleep','study'],['party','sleep','sleep'],['study','sleep','party']etc]

但这太难了。我正在尝试类似的事情:

test2 = open('test2.txt','r')
List=[]

for line in 'test2.txt':
    a = test2.readline()
    a = a.replace("\n","")
    List.append(a)
    print(List)

但这只是可怕的可怕事情。怎么做到这一点?

3 个答案:

答案 0 :(得分:4)

如果要将数据分组为3 。假设文本文件中的数据未按任何分隔符分组。

您需要按顺序读取文件并创建列表。要对其进行分组,您可以使用任何已知的grouper algorithms

from itertools import izip, imap
with open("test.txt") as fin:
    data = list(imap(list, izip(*[imap(str.strip, fin)]*3)))

pprint.pprint(data)
[['party', 'sleep', 'study'],
 ['party', 'sleep', 'sleep'],
 ['study', 'sleep', 'party']]

执行步骤

  1. 使用文件对象创建上下文管理器。
  2. 剥离每一行。 (删除换行符)
  3. 在大小为3的迭代器列表上使用zip,确保将项目分组为三个项目的元组
  4. 将元组转换为列表
  5. 将生成器表达式转换为列表。
  6. 考虑到所有都是生成器表达式,它在一次迭代中完成。

    相反,如果您的数据被分隔并按分隔符------分组,则可以使用itertools.groupby解决方案

    from itertools import imap, groupby
    class Key(object):
        def __init__(self, sep):
            self.sep = sep
            self.count = 0
        def __call__(self, line):
            if line == self.sep:    self.count += 1
            return self.count
    
    
    with open("test.txt") as fin:
        data = [[e for e in v if "----------" not in e]
            for k, v in groupby(imap(str.strip, fin), key = Key("----------"))]
    
    
    pprint.pprint(data)
    [['party', 'sleep', 'study'],
     ['party', 'sleep', 'sleep'],
     ['study', 'sleep', 'party']]
    

    执行步骤

    1. 创建一个Key Class,以便在遇到分隔符时增加计数器。函数调用每隔一次调用计数器就会有条件地增加它。
    2. 使用文件对象创建上下文管理器。
    3. 剥离每一行。 (删除换行符)
    4. 使用itertools.groupby并使用自定义密钥
    5. 对数据进行分组
    6. 从分组数据中删除分隔符并创建组列表。

答案 1 :(得分:3)

你可以试试这个:

res = []
tmp = []

for i, line in enumerate(open('file.txt'), 1):
    tmp.append(line.strip())
    if i % 3 == 0:
        res.append(tmp)
        tmp = []

print(res)

我以为你没有破折号。

编辑:

以下是破折号的示例:

res = []
tmp = []

for i, line in enumerate(open('file.txt')):
    if i % 4 == 0:
        res.append(tmp)
        tmp = []
        continue
    tmp.append(line.strip())

print(res)

答案 2 :(得分:0)

第一个大问题:

for line in 'test2.txt':

给你

't', 'e', 's', 't', '2', '.', 't', 'x', 't'

您需要遍历打开的文件:

for line in test2:

或者,更好:

with open("test2.txt", 'r') as f:
    for line in f:

接下来,您需要做以下两件事之一:

  1. 如果该行包含"-----",请创建一个新的子列表(myList.append([])
  2. 否则,将该行附加到列表中的最后一个子列表(myList[-1].append(line)
  3. 最后,你的print最后不应该缩进;目前,它为每一行打印,而不是仅在处理完成时打印。

        List.append(a)
    print(List)
    

    或许文件的结构更好:

    party,sleep,study
    party,sleep,sleep
    ...
    

    现在每一行都是一个子列表:

    for line in f:
        myList.append(line.split(','))