2012-11-30 97 views
1

我有一個文件,我想在循環中運行。我的文件看起來像這樣:如何從文件中獲取列表以更改爲字典

Hello Hello 
A B C D 
A B C D 
B C D A 
B C D A 
C D A B 
B C D A 

Hello Bye 
A C D B 
C D A B 
A C D B 
D C A B 

和我只通過再循環運行一個循環,空白行。

它應該返回:

{(A, C, D, B): 2, (C, D, A, b):1, (D, C, A, B):1} 

,是有辦法,我可以叫「所有」,這將增加所有排列?

我想這樣做,而不使用任何導入。

到目前爲止,我的功能看起來是這樣的:

# input_word = Hello or Bye 
def file_to_dict (file, input_word): 
    new_dict = {} 
    new_list = [] 

    flag = False 
    for line in f: 
     if 'Hello' in line: 
      continue 
     if not line.strip(): 
      continue 
     lElts = tuple(line.split(' ')) 
     if lElts in dRet: 
      dRet[lElts] += 1 
     else: 
      dRet[lElts] = 1 
    return dRet 

是否有繼續的方法嗎?

而現在這給了我一個錯誤說:

ValueError: I/O operation on closed file 
+0

那麼,有什麼不妥呢?給予預期的vs實際輸出 – Sheena

+0

它給了我錯誤..我似乎無法採取什麼在這個文件:( – user1853961

+1

有什麼錯誤?複製粘貼是你的朋友。請在提問時請包括儘可能多的細節。格式化你的代碼!在Python中格式化很重要! – Sheena

回答

1
read = False  
counting_dict = {} 
#run through the lines in the file 
for line in file: 
    if read and 'Hello' not in line: 
     #do as if the entry already exists 
     try: 
      counting_dict[tuple(line.split())] += 1 
     #if not, create it 
     except KeyError: 
      counting_dict[tuple(line.split())] = 1 
    elif 'Bye' in line: 
     read = True 
    #if 'Hello' is in the line but 'Bye' is not,set read to False 
    else: 
     read = False 
+0

我不介意如果方法很長,但它應該是更容易理解,如果你可以編輯我的邏輯,這將是偉大的 – user1853961

+0

我可以問什麼試試嗎??它是一個單獨的內置福或者只是爲了定義另一個? – user1853961

+0

'try'允許處理異常:如果您只是簡單地執行'a_dict [a_key] + = 1'並且字典中不存在'a_key',將會引發錯誤'KeyError'。在這種情況下,程序不會在這種情況下停止,但執行'除KeyError:'外的部分,其中不存在的鍵被添加到字典中。 – jojo

1

這樣的事情,在分割hello Bye,然後用dict.get()將值添加到字典中。

In [17]: with open("data.txt") as f: 

    spl=f.read().split("Hello Bye") 

    #now spl[1] is 

    # 
    #A C D B 
    #C D A B 
    #A C D B 
    #D C A B 

    #we need to now split these at '\n', or may be use `splitlines()` 
    #for every line apply split, which returns ['D', 'C', 'A', 'B'] 
    #apply tuple() to it, to make it hashable. 
    #now you can use use either defaultdict(int) or dict.get() as used below. 

    dic={}       
    for x in spl[1].split('\n'): 
     if x.strip(): 
      key=tuple(x.split()) 
      dic[key]=dic.get(key,0)+1; 
    print dic 
    ....:  
{('D', 'C', 'A', 'B'): 1, ('A', 'C', 'D', 'B'): 2, ('C', 'D', 'A', 'B'): 1} 
+0

你能更詳細些嗎?並告訴我每件事情都做了什麼,因爲我想使用代碼的想法,而不是複製過去的代碼:S – user1853961

+0

@ user1853961我已經添加了一些更多的細節。 –

+0

非常感謝!我會嘗試這個..除了這是一個先進的我的水平 – user1853961

1

有邏輯錯誤的負荷......我建議你看看如何elif工作

def f_to_dict(f): 
    dRet = {} 
    for line in f: 
     if 'Hello' in line: 
      continue 
     if not line.strip(): 
      continue 
     lElts = tuple(line.split(' ')) 
     if lElts in dRet: 
      dRet[lElts] += 1 
     else: 
      dRet[lElts] = 1 
    return dRet 
+0

這不工作:( – user1853961

+0

給我這個錯誤: 行文件中: ValueError:關閉的文件上的I/O操作 – user1853961

+1

打開文件第一,那麼它應該工作,如果你有一個名爲this_is_a_file.txt的文件,請鍵入'file = open('this_is_a_file.txt','r')'。 – jojo

相關問題