Python 从文本文件读入具有可变列的词典

Python 从文本文件读入具有可变列的词典,python,python-2.7,Python,Python 2.7,我目前正在学习数据挖掘,我正在阅读的电子书中有一个例子,它有一个字典来存储每个用户对一首歌的评分。这是给定词典的初始化 users ={"Angelica": {"Blues Traveler": 3.5, "Broken Bells": 2.0, "Norah Jones": 4.5, "Phoenix": 5.0, "Slightly Stoopid": 1.5, "The Strokes"

我目前正在学习数据挖掘,我正在阅读的电子书中有一个例子,它有一个字典来存储每个用户对一首歌的评分。这是给定词典的初始化

users ={"Angelica": {"Blues Traveler": 3.5, "Broken Bells": 2.0, 
                "Norah Jones": 4.5, "Phoenix": 5.0, 
                "Slightly Stoopid": 1.5, 
                "The Strokes": 2.5, "Vampire Weekend": 2.0},

    "Bill":     {"Blues Traveler": 2.0, "Broken Bells": 3.5, 
                "Deadmau5": 4.0, "Phoenix": 2.0, 
                "Slightly Stoopid": 3.5, "Vampire Weekend": 3.0}, 

    "Chan":     {"Blues Traveler": 5.0, "Broken Bells": 1.0, 
                "Deadmau5": 1.0, "Norah Jones": 3.0, 
                "Phoenix": 5, "Slightly Stoopid": 1.0}}
如果文本文件中有相同的值,并且每行包含每个用户的信息,那么我一直在想如何创建相同的字典。 这是文本文件中第一行的示例:

Angelica, "Blues Traveler": 3.5, "Broken Bells": 2.0, "Norah Jones": 4.5, "Phoenix": 5.0, "Slightly Stoopid": 1.5, "The Strokes": 2.5, "Vampire Weekend": 2.0
到目前为止,我所拥有的:

with open(text_file) as f:
for line in f:
    songs = line.split(',')
    for current_song in songs
        ratings = current_songs.split(':')

我不太确定怎样编这本词典。嵌套字典让我困惑了几个小时。

可以通过json库变得更简洁。我们将做以下工作:

users = {}

with open(text_file) as f:
    for line in f:
        parts = line.rstrip().split(', ')
        name = parts[0]
        users[name] = {}

        for rating in parts[1:]:
            song, score = rating.split(': ')
            song = song[1:-1]
            users[name][song] = score

print users
  • 首先,让我们拆分线条并分离美工人员名称和数据。因此,字符串Angelica,“蓝调旅行者”:3.5,“断铃”:2.0,“诺拉·琼斯”:4.5,被分成两个字符串
    Angelica
    和第二个字符串
    “蓝调旅行者”:3.5,“断铃”:2.0,“诺拉·琼斯”:4.5,

    username, songs = line.split(',', 1)
    
  • 如果仔细观察,通过将第二个字符串导入
    json.loads
    ,可以很容易地将其转换为字典,但是它没有
    {
    }
    使其成为有效的json。因此,我们将手动添加它并将其导入json

    songs = "{%s}" % songs
    json.loads(songs)
    
  • 所以总代码是:

    import json
    
    user = {}
    with open('my.txt') as f:
        for line in f:
            username, songs = line.split(',', 1)
            songs = "{%s}" % songs
            user[username] = json.loads(songs)
    
    print user
    

    可以使用json库使其更加简洁。我们将做以下工作:

  • 首先,让我们拆分线条并分离美工人员名称和数据。因此,字符串Angelica,“蓝调旅行者”:3.5,“断铃”:2.0,“诺拉·琼斯”:4.5,被分成两个字符串
    Angelica
    和第二个字符串
    “蓝调旅行者”:3.5,“断铃”:2.0,“诺拉·琼斯”:4.5,

    username, songs = line.split(',', 1)
    
  • 如果仔细观察,通过将第二个字符串导入
    json.loads
    ,可以很容易地将其转换为字典,但是它没有
    {
    }
    使其成为有效的json。因此,我们将手动添加它并将其导入json

    songs = "{%s}" % songs
    json.loads(songs)
    
  • 所以总代码是:

    import json
    
    user = {}
    with open('my.txt') as f:
        for line in f:
            username, songs = line.split(',', 1)
            songs = "{%s}" % songs
            user[username] = json.loads(songs)
    
    print user
    

    @你可以使用defaultdict,但我认为它不够明确,没有任何好处。如果有用户在多行重复播放不相交的歌曲评级,那么我肯定会使用defaultdict,因为否则结果中只会出现给定用户的最后一行。@Apero:您可以使用defaultdict,但我认为它不太明确,没有任何好处。如果有用户在多行上重复使用不相交的歌曲评级,那么我肯定会使用defaultdict,因为否则结果中只会出现给定用户的最后一行。只是迂腐,但这些不是歌曲,它们实际上是艺术家。只是迂腐,但这些不是歌曲,它们实际上是艺术家。