2013-07-17 2 views
-3

Хорошо, это немного сложно. У меня есть функция, которая принимает два параметра словаря, созданных через txt-файлы, которые уже были возвращены в других функциях. Параметр стран имеет трехбуквенный код страны в качестве ключа и соответствующую страну в качестве значения. в словаре медалей был указан трехбуквенный код как ключ, но с набором, состоящим из четырех целых чисел, которые соответствуют # играм, золотым медалям, серебряным медалям и бронзовым медалям соответственно. Функция состоит в том, чтобы принять трехбуквенный код кода страны через словарь медалей и посмотреть, является ли код ключом в словаре медалей. Возможны три возможности: если это так, то он должен создать список, отформатированный так: [ [‘Country’,’Code’,’Gold’,’Silver’,’Bronze’], [‘Great Britain’ , ‘GRE’ ,800, 400, 750] ]. Эта часть компилирует и составляет список, но часть игры должна быть удалена из значения ключа медали и возвращена как разветвленный список, а не набор/набор. Если строка не является ключом в словаре, то, если строка пуста, она добавляет каждую отдельную страну с указанным форматированием в список. эта часть не компилируется, потому что я зациклирую на ходу неправильно, я думаю. если строка не пустая, а не в словаре, она возвращает [INVALID CODE, n/a]. Эта часть работает, я уверен. Вот мой код:два словаря, делая список

def findMedals(countries, medals): 
    some_strng = input("input a three letter country code and i'll see if I can find it: ") 
    reference = ['Country','Code','Gold','Silver','Bronze'] 
    medalList= [reference] 
    for key in medals.items(): 
     if some_strng in key: 
      medalList.append([countries[some_strng],key,medals[some_strng]]) 
      break 
     if not some_strng in key: 
      if some_strng == '': 
       medalList.append([countries[some_string], key for key in countries,medals[some_strng] for key in medals]) 
      else: 
       medalList.append(['INVALID CODE', 'n/a']) 
    print(medalList)  
    return(medalList) 
    findMedals(country('CountryCodes.txt'),medals('GoldMedals.txt')) 
+0

Пожалуйста, исправьте форматирование своего кода. – Tadeck

+2

Почему бы просто не исправить отступы, а не написать об этом? Кроме того, вы хотите, чтобы люди читали вашу стену слов? – Marcin

+0

Возможно, также исправить незакрытую строку ... –

ответ

0

Это должно работать:

def findMedals(countries, medals): 
    code = raw_input("input a three letter country code and i'll see if I can find it: ") 
    header = ['Country','Code','Gold','Silver','Bronze'] 
    entry = lambda c: [countries[c], c] + list(medals[c][1:]) # creates one table line 
    if code == "": 
     # wildcard -> add each line to table 
     return [header] + [entry(c) for c in medals if c in countries] 
    elif code in countries and code in medals: 
     # valid code -> add one line to table 
     return [header, entry(code)] 
    else: 
     # return 'invalid' line 
     return [['INVALID CODE', 'n/a']] 

countries = {"GER": "Germany", "GBR": "Breat Britain", "USA": "USA", "FOO": "No Medals"} 
medals = {"GER": (0,1,2,3), "GBR": (3,4,5,6), "USA": (6,7,8,9)} # tuples, not sets! 
res = findMedals(countries, medals) 
for line in res: 
    print "\t".join(map(str, line)) 

Некоторые указатели:

  • Ваш for цикл странно. Вы перебор items(), то есть, кортежей ключей и значений, а не ключи в одиночку
  • Вы проверяете в каждой итерацию ли код не является в этом кортеже, то есть, что часть будет выполняться один раз для каждого другого кода страны; вместо этого просто отметьте как только ли код является ключом in словарь
  • Вы сказали, что код medals диктует коды к наборам чисел. Это не сработает, так как наборы неупорядочены, поэтому невозможно определить, какие из чисел - золотые медали, серебро и т. Д. Вместо этого используйте патчи или списки.
  • Хотя я предполагаю, что medals и countries всегда будут придерживаться тех же кодов, я добавил некоторые проверки, чтобы убедиться.
Смежные вопросы