2017-01-18 10 views
1

Я новичок в python, и мне было интересно, как вы будете группировать текстовый файл одним словом. Например, мой текстовый файл выглядит так:Группировка текстового файла словом в Python (ограничено использованием списков)

eggs monday $5 john 
bread monday $3 harry 
bananas wednesday $2 john 
milk saturday $4 sally 
tomatoes sunday $7 sally 

В моем случае я хочу сгруппировать файл по именам. Так что для Джона, например, я хочу, чтобы это было показано, например, так:

[john,[eggs,monday],[bananas,wednesday]] 

и так далее для измотать и вылазки.

Так что сейчас мой код выглядит так, и я смог определить необходимые вещи (а именно имя, элемент и день), но я смущен тем, как я могу сгруппировать его.

def grocery(): 
    file = open('shopping.txt') 

    wholelist = [] 
    innerlist = [] 

    for line in file: 
     lines = line.split() 
     name = lines[3] 
     item = lines[0] 
     day = lines[1] 

Заранее спасибо. Также я ограничен использованием списка в списке, поэтому мне не разрешено использовать словари.

+0

вы считаете, используя словари вместо этого? – e4c5

+0

с целью присвоения этого мини-одного из них мне сказали, что мне нужно использовать списки, поэтому пока я пытаюсь понять, как сортировать его под этими ограничениями. – coffeesnake

+0

вашему лектору нужно много кофе – e4c5

ответ

2

Вы можете попробовать что-то вроде этого, если у вас есть ограничение на использование списков только:

a ="""eggs monday $5 john 
bread monday $3 harry 
bananas wednesday $2 john 
milk saturday $4 sally 
tomatoes sunday $7 sally""" 

sents = [b.split() for b in a.splitlines()] 
names = [] 
for s in sents: 
    if s[3] not in names: 
     names.append(s[3]) 
     names.append([]) 

for name in names: 
    for s in sents: 
     if name == s[3]: 
      names[names.index(name)+1].append([s[0], s[1]]) 

for no in range(0,len(names),2): 
    print [names[no]] + [a for a in names[no+1]] 

Выходные:

['john', ['eggs', 'monday'], ['bananas', 'wednesday']] 
['harry', ['bread', 'monday']] 
['sally', ['milk', 'saturday'], ['tomatoes', 'sunday']] 
-1

попробовать это

from collections import defaultdict 

def grocery(): 
    wholelist = defaultdict(list) 
    with open('shopping.txt') as file: 
     for line in file: 
      lines = line.split() 
      wholelist[lines[3]].append(lines[0:2]) 
    return wholelist 

custom_list = [[key]+val for key,val in grocery().items()] 
print (sorted(custom_list,key=lambda data:data[0])) 

custom_list имеет формат, который вы хотели

+1

почему весь ответ получил 2 голоса? –

+1

Кто знает? Репутация - это не деньги, у вас есть лучшие вещи, о которых нужно беспокоиться ... – holdenweb

0

Если не ограничивается использованием списков и словарей, я рекомендую использовать PythoN Data AnalysiS library(pandas) для таких табличных данных с неоднородными типами полей.

Это бы что-то вроде этого

import pandas as pd 
df = pd.read_table('data.txt', names=['item', 'day', 'price', 'name'], 
        delim_whitespace=True) 
for name, group in df.groupby('name'): 
    print name, ':' 
    print group[['item','day']] 

Выход

harry : 
    item  day 
1 bread monday 
john : 
     item  day 
0  eggs  monday 
2 bananas wednesday 
sally : 
     item  day 
3  milk saturday 
4 tomatoes sunday 

Если вы ограничены использованием только списки, как вы указали в комментариях, я хотел бы использовать .index() метод list объектов, так:

table = [line.strip().split() for line in lines] # strip the newline char 
table = [row for row in table if len(row) > 0] # remove empty lines 
names = [] # for keeping names 
groups = [] # for keeping groups associeated to names 

for row in table: 
    item, day, price, day = row 
    try: 
     i = names.index(name) 
    except ValueError: 
     names.append(name) 
     i = len(names) - 1 
     groups.append([]) 
    groups[i].append([item, day]) 

result = list(zip(names, groups)) 
-1
with open('shopping.txt') as file: 
    d = defaultdict(list) 
    for line in file: 

     lines = line.split() 
     print(lines) 
     name = lines[3] 
     item = lines[0] 
     day = lines[1] 
     d[name].append([item, day]) 

из:

defaultdict(list, 
      {'harry': [['bread', 'monday']], 
      'john': [['eggs', 'monday'], ['bananas', 'wednesday']], 
      'sally': [['milk', 'saturday'], ['tomatoes', 'sunday']]})