2013-03-06 6 views
1

у меня есть 2 вида списков: имена и оценки, и я стараюсь, чтобы объединить результаты так, что все оценки объединены в существующий списоксписок индексов должны быть целыми, не ул

я получаю «перечень индексы должны быть целыми, не 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))]) 
+0

Почему вы не объединить их просто: 'name1 = name1 + name2' и' score2 = score1 + score2'? –

+1

icanc: OP хочет, чтобы результаты были объединены по имени. То есть в результирующем списке должна быть только одна запись для каждого имени и оценка, соответствующая сумме баллов, связанных с этим именем во входных списках. – Wilduck

+0

@ Wilduck Ах, спасибо за разъяснение. –

ответ

5

Trust в сообщении об ошибке: она говорит вам именно то, что проблема есть. Когда вы делаете score2[i], спросите себя: «что я?»

В этом контексте i является элементом name2. Даже если ваш примерный код показывает его как [bob, cahterine, jim, will, lucy], я предполагаю, что это строки.

8

Возможно, вы захотите поместить такие данные в 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}) 

Кроме того, обратите внимание на Karl's answer. Это еще больше упрощает.

+1

+1 для хорошей выбор структуры данных, избивая меня до удара на пару минут. –

+0

Вам не нужен промежуточный dict, просто выполните 'Counter (zip (name1, score1))' и т. Д. –

+0

@gnibbler Да, но вам понадобится 'Counter (dict (zip (name1, score1)))'. Я просто хотел показать шаги к OP, поэтому было бы легче следовать. Конечно, вы можете упростить все это, как и в ответе Карла. – crayzeewulf

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) 
8

У вас есть результаты, которые концептуально , связанные с именами. Это говорит о том, что вы используете неправильную структуру данных. В частности, цифры представляют собой оценки, которые вы собираетесь суммировать, или более того, , подсчитывая вверх.

У 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).

  • Строки имеют котировки вокруг них. Не перепутайте строки с именами переменных.

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] 

вы можете использовать списковые

Смежные вопросы