2016-05-05 11 views
2

問題は、このテキストファイルに参加者の最大数を持っているイベントの名前を返すことです最大値を求める:だから私は、私はそれを分割しなければならなかった考え出しPythonはIOファイル - 辞書を構築し、そして

#Beyond the Imposter Syndrome 
32 students 
4 faculty 
10 industries 
#Diversifying Computing Panel 
15 students 
20 faculty 
#Movie Night 
52 students 

をキーをイベント名として、値を他の行の先頭にある整数の合計として辞書に追加します。私は多くの問題を抱えており、私はそれがそれほど複雑すぎると思っています。

これは私がこれまで持っているものです。

def most_attended(fname): 
    '''(str: filename,)''' 
    d = {} 
    f = open(fname) 
    lines = f.read().split(' \n') 
    print lines 
    indexes = [] 
    count = 0 
    for i in range(len(lines)): 
     if lines[i].startswith('#'): 
      event = lines[i].strip('#').strip() 
      if event not in d: 
       d[event] = [] 
      print d 
      indexes.append(i) 
      print indexes 
     if not lines[i].startswith('#') and indexes !=0: 
      num = lines[i].strip().split()[0] 
      print num 
      if num not in d[len(d)-1]: 
       d[len(d)-1] += [num] 
    print d 

    f.close() 

答えて

1

は、ここで私はそれを行うだろう方法です。

with open("test.txt", "r") as f: 
    docText = f.read() 

eventsList = [] 

#start at one because we don't want what's before the first # 
for item in docText.split("#")[1:]: 
    individualLines = item.split("\n") 
    #get the sum by finding everything after the name, name is the first line here 
    sumPeople = 0 
    #we don't want the title 
    for line in individualLines[1:]: 
     if not line == "": 
      sumPeople += int(line.split(" ")[0]) #add everything before the first space to the sum 
    #add to the list a tuple with (eventname, numpeopleatevent) 
    eventsList.append((individualLines[0], sumPeople)) 

#get the item in the list with the max number of people 
print(max(eventsList, key=lambda x: x[1])) 

基本的には、まずそれが常に空になるだろうので、最初の項目を無視して、#で文書を分割します。今あなたはイベントのリストを持っています。今度はあなたが通過しなければならないイベントごとに、そのイベントの追加行ごとに(最初の行を除く)その行の値を合計に追加する必要があります。次に、(eventname) (numPeopleAtEvent)のようなタプルのリストを作成します。最後にmax()を使用して最大人数のアイテムを取得します。

明らかにあなたは、上記のものに、しかし、あなた

+0

ありがとうございました!これはまさに私がやろうとしていたものでした!私はすべての分裂と混同しました。私は最大の表記法をまだ学んでいないので、タプルのリストでmaxを見つけるために小さなループを書きました。 – holophrasm

2
import sys 
from collections import defaultdict 
from operator import itemgetter 

def load_data(file_name): 
    events = defaultdict(int) 
    current_event = None 
    for line in open(file_name): 
     if line.startswith('#'): 
      current_event = line[1:].strip() 
     else: 
      participants_count = int(line.split()[0]) 
      events[current_event] += participants_count 
    return events 


if __name__ == '__main__': 
    if len(sys.argv) < 2: 
     print('Usage:\n\t{} <file>\n'.format(sys.argv[0])) 
    else: 
     events = load_data(sys.argv[1]) 
     print('{}: {}'.format(*max(events.items(), key=itemgetter(1)))) 
0

のような同様の答えにそれをフォーマットすることができ('Movie Night', 104)このコードを印刷します。

result = {}   # store the results 
current_key = None # placeholder to hold the current_key 

for line in lines: 
    # find what event we are currently stripping data for 
    # if this line doesnt start with '#', we can assume that its going to be info for the last seen event 
    if line.startswith("#"): 
     current_key = line[1:] 
     result[current_key] = 0 
    elif current_key: 
     # pull the number out of the string 
     number = [int(s) for s in line.split() if s.isdigit()] 
     # make sure we actually got a number in the line 
     if len(number) > 0: 
      result[current_key] = result[current_key] + number[0] 

print(max(result, key=lambda x: x[1])) 

「映画ナイト」が印刷されます。

0

あなたは辞書なしでそれを行うだけのリストを使用している場合、多分それは少し簡単にすることができます。

with open('myfile.txt', 'r') as f: 
    lines = f.readlines() 
    lines = [l.strip() for l in lines if l[0] != '#'] # remove comment lines and '\n' 
    highest = 0 
    event = "" 
    for l in lines: 
     l = l.split() 
     if int(l[0]) > highest: 
      highest = int(l[0]) 
      event = l[1] 

print (event) 
0

あなたの問題の説明では、参加者の数が最も多いイベントを見つけたいと言っています。私はリストや辞書を使用しないソリューションを試しました。

Ps:私はPythonの新機能です。

bigEventName = "" 
participants = 0 

curEventName = "" 
curEventParticipants = 0 

# Use RegEx to split the file by lines 
itr = re.finditer("^([#\w+].*)$", lines, flags = re.MULTILINE) 

for m in itr: 
    if m.group(1).startswith("#"): 
     # Whenever a new group is encountered, check if the previous sum of 
     # participants is more than the recent event. If so, save the results. 
     if curEventParticipants > participants: 
      participants = curEventParticipants 
      bigEventName = curEventName 

     # Reset the current event name and sum as 0 
     curEventName = m.group(1)[1:] 
     curEventParticipants = 0 
    elif re.match("(\d+) .*", m.group(1)): 
     # If it is line which starts with number, extract the number and sum it 
     curEventParticipants += int(re.search("(\d+) .*", m.group(1)).group(1)) 

# This nasty code is needed to take care of the last event 
bigEventName = curEventName if curEventParticipants > participants else bigEventName 

# Here is the answer 
print("Event: ", bigEventName) 
関連する問題