python字典中的得分图案

时间:2017-01-31 23:33:59

标签: python

我在python中有一个字典,看起来像这样:

raw = {'id1': ['KKKK', 'MMMMMMMMMMMMMMM'], 'id2': ['KKKKM', 'KKKKKK']}

如您所见,值是列表。我想用一个得分的数字替换列表。我根据长度为列表中的每个字符打分。如果长度是4到9他们会得到1,从10到15将是2和16和更长会得到3.然后我加上每个id的所有得分并且每个id有一个得分。这是一个小例子:

score = {'id1': 3, 'id2': 2}

我试过这段代码:

score = {}
for val in raw.values():
    for i in val:
        if len(i) >=4 and len(i) <9:
            sc = 1
        elif len(i) >=10 and len(i) <15:
            sc = 2
        else:
            sc = 3
        score[raw.keys()] = sc

它没有给出我想要的东西。

3 个答案:

答案 0 :(得分:0)

我在你的例子中看到两个问题。

首先是分数没有增加。您应该在外部循环中初始化计数器,并在迭代密钥中的项目时递增它。

for val in raw.values():
    score = 0
    for i in val:
        ...
        score += 1  # or 2 or 4

第二个问题是您需要在存储乐谱时访问您正在评分的特定键。由于“raw.keys()”返回所有键的列表,因此在存储值时使用它是没有意义的。 相反,你的外部循环应该遍历键和值,从而让你知道你当前使用的是什么键。

for key, val in raw.items():
    ....

总结一下,这是一个有效的例子:

score = {}
for key, val in raw.items():  # iterating over both key and value (.items instead of .values)
    cur_score = 0  # initializing the current score counter
    for item in val:  # use readable names!
        item_len = len(item)  # calculated once for efficiency
        if 4 <= item_len < 9:  # the python way to check value in range
            cur_score += 1
        elif 10 <= item_len < 15:
            cur_score += 2
        else:
            cur_score += 3
        score[key] = cur_score

玩得开心!

答案 1 :(得分:0)

您尝试使用整个键列表作为字典的索引。此外,您将该分配放在两个循环中。您在每次迭代时期望做什么?

首先,你的外部循环必须遍历字典元素列表,而不仅仅是值。你需要这样的东西:

for key, val in raw.iteritems():

接下来,您需要维护各个字符串的分数的运行总计。你应该看一下......但基本的想法是

    total = 0
    for item in my_list:  # you have to determine what my_list should be
        sc = # score for that item
        total += sc

......最后,在这个循环之后......

    score[key] = total

这应该让你前进。

答案 2 :(得分:0)

您需要遍历字典的所有键值对,并维护字典值的每个元素的分数的运行总计(在您的情况下是一个列表)。

您可以按如下方式改造代码,以获得所需的输出。

raw = {'id1': ['KKKK', 'MMMMMMMMMMMMMMM'], 'id2': ['KKKKM', 'KKKKKK']}

score = {}
# iterating through all the key, value pairs of the dictionary
for key, value in raw.items():
    sc = 0
    # iterating through all the elements of the current value
    for item in value:
        if len(item) >=4 and len(item) <=9:
            sc += 1
        elif len(item) >=10 and len(item) <=15:
            sc += 2
        else:
            sc += 3
    score[key] = sc

print(score)

输出:

{'id1': 3, 'id2': 2}

因此,循环for key, value in raw.items():针对字典的每个键值对运行'id1': ['KKKK', 'MMMMMMMMMMMMMMM']'id2': ['KKKKM', 'KKKKKK']

然后嵌套循环for item in value:为两个字典键的值['KKKK', 'MMMMMMMMMMMMMMM']['KKKKM', 'KKKKKK']运行两次。