Python列表构建

时间:2012-11-13 05:01:48

标签: python python-3.x

我必须从.txt文件构建一个购物清单的功能,如下所示:

milk
cheese

bread
hotdog buns

chicken
tuna
burgers

等等。从上面的列表中,我的购物清单应该看起来像[['milk', 'cheese'], ['bread', 'hotdog buns'], ['chicken', 'tuna', 'burgers']],所以当文本文件中有一个空格时,项目被分开的列表列表。

我必须使用.readline(),我无法使用.readlines(), .read()for循环。我的代码现在创建一个空列表:

def grocery_list(foods):
    L = open(foods, 'r')
    food = []
    sublist = []
    while L.readline() != '':
        if L.readline() != '\n':
            sublist.append(L.readline().rstrip('\n'))
        elif L.readline() == '\n':
            food.append(sublist)
            sublist = []
    return food

我不知道它出错了所以它返回一个完全空的列表。我也不确定'''\n'部分;我正在使用的示例测试文件,在shell中打开时,如下所示:

milk\n
cheese\n
\n
...
''
''

.rstrip()或整个!= ''对每个列表都有意义吗?或者我甚至没有走上正确的轨道?

4 个答案:

答案 0 :(得分:4)

一个问题是您没有将最终sublist添加到结果中。正如@Xymostech所提到的,您需要将每次调用的结果捕获到readline(),因为下一个调用将是不同的。以下是我修改代码的方法。

def grocery_list(foods):
    with open(foods, 'r') as L:        
        food = []            
        sublist = []            

        while True:
            line = L.readline()
            if len(line) == 0:
                break

            #remove the trailing \n or \r
            line = line.rstrip()

            if len(line) == 0:
                food.append(sublist)
                sublist = []                    
            else:
                sublist.append(line)
        if len(sublist) > 0:
            food.append(sublist)

        return food

注意使用with语句。这可确保文件在不再需要后关闭。

答案 1 :(得分:2)

我已经修改了您的代码,以实现您想要的目标:

def grocery_list(foods):
    with open(foods,'r') as f:
        food=[]
        sublist=[]
        while True:
            line=f.readline()
            if len(line)==0:
                break
            if line !='\n':
                sublist.append(line.strip())
            else:
                food.append(sublist)
                sublist=[]
        food.append(sublist)
    return food

答案 2 :(得分:2)

在我看来,有点整洁。另一种获得所需结果的选择。

def grocerylist(foods):  
  with open(foods) as f:
    line = f.readline()
    items = []
    while line:
      items.append(line.rstrip())
      line = f.readline()
    newlist = [[]]
    for item in a:
      if not x: newlist.append([])
      else: newlist[-1].append(x)
    return newlist

newlist现在包含以下内容:

[['milk', 'cheese'], ['bread', 'hotdog buns'], ['chicken', 'tuna', 'burgers']]

答案 3 :(得分:1)

每次你打电话给L.readline(),你都会读到另一行。您应该第一次存储它的值,并在每个下一个语句中使用该值。