字典问题

时间:2012-04-03 06:01:00

标签: python dictionary list-comprehension

 rdict = {}
    f = open(filename)
    for line in f: 
        d = line.split()
        name = d[0]
        rating = int(d[2])
        if name in rdict:
            pass
        else: 
            zlist = []
            for i in range[150]:
                rdict[name] = #a list of ratings

我想将值(从此外部给出的数据!)添加到范围150的rdict中。我将rdict设置为等于什么?

2 个答案:

答案 0 :(得分:5)

根据您所慷慨提供的线索,我对您的数据形状进行了两次猜测:

  1. 数据类似于一个文件,其中有许多行包含第​​一列中的名称(第0列)以及第3列(第2列)中该名称的评级。在这种情况下,我猜测每个名称的评级为150次,因此文件中出现的每个名称都会出现150次。在这个场景中,我用defaultdict替换了你的字典,其工厂参数是list,这意味着每个名称的值将默认为空列表,然后对于我们处理的每一行,我们只需将评级添加到列表中。

    from collections import defaultdict
    
    rdict = defaultdict(list)
    f = open(filename)
    for line in f: 
       d = line.split()
       name = d[0]
       rating = int(d[2])
       rdict[name].append(rating)
    
  2. 也许您有更多的柱状类型的文件,每行有150个评级,在这种情况下,以下代码可能更接近您所寻找的内容:

    from collections import defaultdict
    
    FIRST_RATING_COL=1
    rdict = {}
    f = open(filename)
    for line in f:
        d = line.split()
        name = d[0]
        string_ratings = d[FIRST_RATING_COL:]
        int_ratings = map(int, string_ratings)
        rdict[name] = int_ratings
    

    在第二种情况下,由于评级一次可用,我们可以坚持使用原始字典,我们只需将正确的列集提取到列表中,然后将整个列表一次性转换为整数,然后分配结果列表在rdict中的相应名称。您可能需要使用FIRST_RATING_COL的值来查找正确的起始点,具体取决于文件的布局方式。

  3. 如果这些都不正确,那么我怀疑提供一个数据示例或有关它的形状的更多信息将有助于人们提供更有用的答案。

答案 1 :(得分:0)

如果您尝试将每个“名称”与值列表相关联,则下面的代码可能就是它。

rdict = {}
f = open("filename")
for line in f: 
    d = line.split()
    name = d[0]
    rating = int(d[2])
    if name in rdict:
        pass
    else: 
        zlist = []
        for i in range(150):
            zlist.append("V" + str(i) )
        rdict[name] = zlist
print(rdict)