1

我有两种类型的列表:名称和分数,我正在尝试合并分数,以便将所有分数合并到现有列表中

我不断收到“列表索引必须是整数,而不是 str”错误

name1= [jim, bob, john, smith]

score1= [4,7,3,11]

name2= [bob, cahterine, jim, will, lucy]

score2= [6,12,7,1,4]

我希望结果是:

name1 = [jim, bob, john, smith, catherine, will, lucy]

score2 = [11, 13 ,3 ,11 ,12 ,1 ,4]


def merge(name1,score1, name2,score2):

     for i in name2:
        if i in name1:
           indexed= name1.index(i)
           score2[i] =score1[int(indexed)]+score2[i]
        if i not in name1:
           name1.append(i)
           score1.append(score2[(name1.index(i))])
4

5 回答 5

9

您可能需要考虑将此类数据放在模块中的Counter类中。collections例如:

#! /usr/bin/env python
from collections import Counter

name1 = ["jim", "bob", "john", "smith"]
score1 = [4,7,3,11]
name2 = ["bob", "cahterine", "jim", "will", "lucy"]
score2 = [6,12,7,1,4]

first_set = dict(zip(name1, score1))
second_set = dict(zip(name2, score2))

print Counter(first_set) + Counter(second_set)

这将打印以下内容:

Counter({'bob': 13, 'cahterine': 12, 'jim': 11, 'smith': 11, 'lucy': 4, 'john': 3, 'will': 1})

另外,看看卡尔的回答。它更加简化了这一点。

于 2013-03-07T00:09:14.990 回答
9

您的分数在概念上名称相关联。这告诉您您使用了错误的数据结构。特别是,数字代表你将要加起来的分数,或者更重要的是,加起来

Python为此提供了一个内置工具。

from collections import Counter

results_1 = Counter(jim = 4, bob = 7, john = 3, smith = 11)
results_2 = Counter(bob = 6, catherine = 12, jim = 7, will = 1, lucy = 4)

results_1 + results_2 # yes, it's really this easy.

至于你的错误信息,它的意思正是它所说的,@BryanOakley 已经彻底解释过了。但我需要指出的是,在编程中,你必须精确、一致,并不断关注细节。良好的习惯可以避免这些错误,因为你一直在思考你在做什么以及它究竟意味着什么。样式约定也有帮助:

  • 在它实际包含的东西之后命名你的迭代器。因为,在 Python 中,迭代列表实际上会为您提供列表中的项目(不是整数索引),所以请使用暗示实际列表项目的名称,而不是像i.

  • 用复数名称命名您的列表和其他容器,以便您的代码自然地描述正在发生的事情。因此,编写类似for name in names:.

但我提到“注意细节”是因为

  • 当你发布你的代码时,不要输入它;复制和粘贴,以便我们可以准确地看到您拥有的内容。

  • 拼写计数。错别字伤害(cahterine)。

  • 字符串周围有引号。不要将字符串与变量名混淆。

于 2013-03-07T00:12:37.540 回答
5

相信错误信息:它准确地告诉你问题出在哪里。当你这样做时score2[i],问问自己“我是什么?”

在这种情况下,i 是 name2 的一个元素。即使您的示例代码显示为[bob, cahterine, jim, will, lucy],我猜这些是字符串。

于 2013-03-06T23:57:25.443 回答
0
def sum(index, name):
    score2[index] += score1[name1.index(name)]


name1= ["jim", "bob", "john", "smith"]
score1= [4,7,3,11]
name2= ["bob", "cahterine", "jim", "will", "lucy"]
score2= [6,12,7,1,4]

[sum(index, _name) for index, _name in enumerate(name2) if _name in name1 and _name in name2]

你可以使用列表推导

于 2013-03-07T03:42:14.297 回答
0

我得到了这个工作,但我不知道这是否是你要找的?

name1= ['jim', 'bob', 'john', 'smith']
name2= ['bob', 'cahterine', 'jim', 'will', 'lucy']
score1= [4,7,3,11]
score2= [6,12,7,1,4]
def merge (name1,score1, name2,score2):
    for x in range(0,len(name1)):
        name2.append(name1[x])
    for x in range(0,len(score1)):
        score2.append(score1[x])
    print name2
    print score2
merge(name1,score1, name2,score2)
于 2013-03-07T00:09:41.703 回答