Python 返回列表

Python 返回列表,python,file,list,nested,Python,File,List,Nested,我有一个关于返回以下函数的问题 我收到一个文件,上面有一份食物清单,看起来像这样: ''' bread bun milk soya milk ''' with open('grocery_list.txt', 'rt') as grocery_list_file: data = grocery_list_file.read() sublist = [item.strip().split('\n') for item in data.split('\n\n')] 我必须返回一份食物

我有一个关于返回以下函数的问题 我收到一个文件,上面有一份食物清单,看起来像这样:

'''
bread
bun

milk
soya milk
'''
with open('grocery_list.txt', 'rt') as grocery_list_file:
    data = grocery_list_file.read()

sublist = [item.strip().split('\n') for item in data.split('\n\n')]
我必须返回一份食物清单,例如,
[[['面包','bun'],['牛奶','豆浆]]


我对python和编程非常陌生,因此为了创建我的列表,我一直停留在for循环上。如果您有任何意见,我们将不胜感激-kev

非常接近。当len(next_food)>0:时,当next_food为空白和非空白时,您应该使用if并处理这两种情况,而不是使用
。正如您的注释所指出的,在返回之前,您应该包括最后一个子列表

另一件要检查的事情是,下一道菜的结尾是否有新词。如果有断线,你应该把它剥掉。最后,还有一个快捷方式,可以替代检查
if len(下一个食物):
。只要写下
,如果下一个食物:
就可以了。

那就行了

grocery_list_file = open('foods.txt','r').read()
foods = grocery_list_file.split("\n\n") #split on blank lines

result = []
for food in foods:
   newFood = food.split("\n") # split the lines, creating the output...
   result += [newFood]
return result
在一行中:

print [f.strip().split("\n") for f in open('foods.txt','r').read().split("\n\n")]

您希望在到达新类别时附加子列表,然后启动一个新的子列表。到达文件末尾时,将剩余的子_列表附加到末尾非常重要

new_list.append("\n")   #to make sure it appends the last category
for next_food in new_list:
        if next_food = "\n":
            result.append(sub_list)
            sub_list = []
        else:
            sub_list.append(next_food)

这不是一个很好的解决方案。。。但这是一些有趣的把戏

>>> s = '''
... bread
... bun
...
... milk
... soya milk
... '''
>>> import re
>>> parts = re.sub("[\[\]']","",str(s.strip().splitlines())).split(", ,")
>>> import string
>>> print [map(string.strip,p.split(",")) for p in parts]
[['bread', 'bun'], ['milk', 'soya milk']]
使用:


如果您正在学习Python,我真的建议您熟悉这个优秀的模块——它非常方便

最简单且可读性较好的方法是:

>>> [el.strip().split('\n') for el in text.split('\n\n')]
[['bread', 'bun'], ['milk', 'soya milk']]
  • \n\n
    拆分会产生一行,紧接着是一个空行

  • .strip()
    删除前导和尾随的换行符,因此只有两行之间的换行符 元素在那里

  • 然后,
    拆分
    将这些元素拆分为一个列表,从而生成列表列表

  • 或者,您可以使用
    itertools.groupby

    >>> [groups for groups in (list(g) for k, g in groupby(text.splitlines(), bool)) if groups[0]]
    [['bread', 'bun'], ['milk', 'soya milk']]
    

    如果输入文件足够小,可以完全读入内存,我会这样做:

    '''
    bread
    bun
    
    milk
    soya milk
    '''
    
    with open('grocery_list.txt', 'rt') as grocery_list_file:
        data = grocery_list_file.read()
    
    sublist = [item.strip().split('\n') for item in data.split('\n\n')]
    
    输出:

    子列表:[[面包],[面包],[牛奶],[豆奶]]
    
    您如何对这些食物进行分组?它们在文件中按行与行之间的空格进行分组,如果两组食物之间有空格,这意味着上一组食物是它自己的,这实际上不起作用,因为它将跳过最后一组食物。检查一下!;)好电话。我不确定sub_列表是否是for循环的本地列表。我认为不会,因为它是在外面宣布的。