2017-04-11 13 views
1

我試圖讀取兩個.dat文件並創建一個程序,該程序使用aid2name的值作爲字典中的鍵它具有aid2numplays的關鍵和價值,並被設定爲它的價值觀。這一切都是爲了讓文件產生一個包含(藝術家姓名,藝術家ID,劇本頻率)的結果。值得注意的是,第一個文件提供了藝術家姓名和藝術家ID,而第二個文件提供了每個用戶的用戶ID,藝術家ID和頻率。任何想法如何聚合這些頻率的用戶,然後顯示他們(藝術家的名字,藝術家ID,播放頻率)格式?下面是我迄今管理:在Python 3.6中使用setdefault使用來自兩個不同文件的信息顯示(名稱,ID和頻率計數)

import codecs 
aid2name = {} 
d2 = {} 
fp = codecs.open("artists.dat", encoding = "utf-8") 
fp.readline() #skip first line of headers 
for line in fp: 
    line = line.strip() 
    fields = line.split('\t') 
    aid = int(fields[0]) 
    name = fields[1] 
    aid2name = {int(aid), name} 
    d2.setdefault(fields[1], {}) 
    #print (aid2name) 
# do other processing 
    #print(dictionary) 

aid2numplays = {} 
fp = codecs.open("user_artists.dat", encoding = "utf-8") 
fp.readline() #skip first line of headers 
for line in fp: 
    line = line.strip() 
    fields = line.split('\t') 
    uid = int(fields[0]) 
    aid = int(fields[1]) 
    weight = int(fields[2]) 
    aid2numplays = [int(aid), int(weight)] 
    #print(aid2numplays) 
    #print(uid, aid, weight) 

for (d2.fields[1], value) in d2: 
    group = d2.setdefault(d2.fields[1], {}) # key might exist already 
    group.append(aid2numplays) 

print(group) 
+0

這可能有助於看到最終的數據結構應該是什麼樣子,我不能確定你打算如何使用[setdefault(HTTP的例子:/ /stackoverflow.com/questions/3483520/use-cases-for-the-setdefault-dict-method) – brennan

回答

1

編輯:關於使用setdefault,如果你想組由artistID用戶數據,那麼你可以:

grouped_data = {} 
for u in users: 
    k, v = u[1], {'userID': u[0], 'weight': u[2]} 
    grouped_data.setdefault(k, []).append(v) 

這主要是同寫:

grouped_data = {} 
for u in users: 
    k, v = u[1], {'userID': u[0], 'weight': u[2]} 
    if k in grouped_data: 
     grouped_data[k].append(v) 
    else: 
     grouped_data[k] = [v] 

至於怎麼算的藝術家出現在不同的用戶數據的次數的例子,你ç烏爾德 - 將數據讀入列表的列表:

with codecs.open("artists.dat", encoding = "utf-8") as f: 
    artists = f.readlines() 

with codecs.open("user_artists.dat", encoding = "utf-8") as f: 
    users = f.readlines() 

artists = [x.strip().split('\t') for x in artists][1:] # [['1', 'MALICE MIZER', .. 
users = [x.strip().split('\t') for x in users][1:] # [['2', '51', '13883'], ..] 

迭代藝術家使用artistID作爲重點打造的字典。添加遊戲統計信息的佔位符。

data = {} 
for a in artists: 
    artistID, name = a[0], a[1] 
    data[artistID] = {'name': name, 'plays': 0} 

遍歷用戶更新字典與每個行:

for u in users: 
    artistID = u[1] 
    data[artistID]['plays'] += 1 

輸出,用於數據

{'1': {'name': 'MALICE MIZER', 'plays': 3}, 
'2': {'name': 'Diary of Dreams', 'plays': 12}, 
'3': {'name': 'Carpathian Forest', 'plays': 3}, ..} 

編輯:遍歷用戶數據,並創建一個所有與用戶相關的藝術家字典,我們可以:

artist_list = [x.strip().split('\t') for x in artists][1:] 
user_stats_list = [x.strip().split('\t') for x in users][1:] 

artists = {} 
for a in artist_list: 
    artistID, name = a[0], a[1] 
    artists[artistID] = name 

grouped_user_stats = {} 
for u in user_stats_list: 
    userID, artistID, weight = u 
    if userID not in grouped_user_stats: 
     grouped_user_stats[userID] = { artistID: {'name': artists[artistID], 'plays': 1} } 
    else: 
     if artistID not in grouped_user_stats[userID]: 
      grouped_user_stats[userID][artistID] = {'name': artists[artistID], 'plays': 1} 
     else: 
      grouped_user_stats[userID][artistID]['plays'] += 1 
      print('this never happens') 
      # it looks the same artist is never listed twice for the same user 

輸出:

{'2': {'100': {'name': 'ABC', 'plays': 1}, 
     '51': {'name': 'Duran Duran', 'plays': 1}, 
     '52': {'name': 'Morcheeba', 'plays': 1}, 
     '53': {'name': 'Air', 'plays': 1}, .. }, 
.. 
} 
+0

要最終在(藝術家名稱,藝術家ID,劇本頻率)格式中顯示它們:'[{'id': k,** v}表示k,v表示data.items()]或'[(k,** v)表示k,v表示data.items()]'表示字典各自的元組列表。 – mab

+0

謝謝你們兩位。我一直從不同的角度看待它,但我覺得現在就點擊它。布倫,出於好奇,你怎麼知道輸出沒有文件的細節? – pythonuser890

+0

此外,我想知道如何聚合每位藝術家的總劇本?我一直在努力通過用戶ID來添加遊戲,然後將它們顯示爲聚合。任何提示,建議都非常有幫助。非常感謝您提供這些提示。 – pythonuser890

相關問題