2015-05-30 2 views
1

После окончания моего кода, у меня есть словарь, как так:питона - Подняв ключ словаря в другом файл с двумя критериями

{'"WS1"': 1475.9778073075058, '"BRO"': 1554.1437268304624, '"CHA"': 1552.228925324831} 

То, что я хочу сделать, это найти каждый из ключей в отдельный файл, teams.txt, который отформатирован так:

1901,'BRO','LAD' 
1901,'CHA','CHW' 
1901,'WS1','MIN' 

Использование года, что 1901, и команда, которая является ключом каждого элемента в словаре, я хочу, чтобы создать новый словарь, где ключ является третьим столбцом в файле teams.txt, если год и команда совпадают, а значение - это значение команды в первый словарь.

Я полагал, что это было бы проще всего, если бы я создал функцию «поиска» года и команды и вернул «franch», а затем применил эту функцию к каждому ключу в словаре. Это то, что я до сих пор, но это дает мне KeyError

def franch(year, team_str): 
    team_str = str(team_str) 
    with open('teams.txt') as imp_file: 
    teams = imp_file.readlines() 
    for team in teams: 
    (yearID, teamID, franchID) = team.split(',') 
    yearID = int(yearID) 
    if yearID == year: 
     if teamID == team_str: 
     break 
    franchID = franchID[1:4] 
    return franchID 

А в другой функции со словарем, что я хочу, чтобы применить эту функцию:

franch_teams={} 
    for team in teams: 
    team = team.replace('"', "'") 
    franch_teams[franch(year, team)] = teams[team] 

Идеальный выход, что Я пытаюсь выполнить, будет выглядеть так:

{'"MIN"': 1475.9778073075058, '"LAD"': 1554.1437268304624, '"CHW"': 1552.228925324831} 

Спасибо!

+0

Можете ли вы опубликовать 'KeyError'? –

+0

Цитата «Используя год, который составляет 1901 год, и команда, которая является ключевым элементом каждого элемента в словаре, я хочу создать новый словарь, где ключ является третьим столбцом в файле teams.txt, если год и команда оба match, а значение - это значение команды в первом словаре ». Не могли бы вы прояснить это? –

+0

@CrazyPython 'KeyError:" 'WS1' "' Что я хочу сделать, это вернуть franchID за год (1901) и команду, которая является ключом словаря – Ike348

ответ

0

Имеет ли этот набор кодов ваши потребности?

Я делаю дополнительную проверку на равенство, потому что в разных частях вашего кода были разные строковые знаки.

def almost_equals(one, two): 
    one = one.replace('"', '').replace("'", "") 
    two = two.replace('"', '').replace("'", "") 
    return one == two 

def create_data(year, data, text_content): 
    """ This function returns new dictionary. """ 
    content = [line.split(',') for line in text_content.split('\n')] 
    res = {} 

    for key in data.keys(): 
     for one_list in content: 
      if year == one_list[0] and almost_equals(key, one_list[1]): 
       res[one_list[2]] = data[key] 

    return res 


teams_txt = """1901,'BRO','LAD' 
1901,'CHA','CHW' 
1901,'WS1','MIN'""" 

year = '1901' 
data = { '"WS1"': 1475.9778073075058, '"BRO"': 1554.1437268304624, '"CHA"': 1552.228925324831 } 
result = create_data(year, data, teams_txt) 

И выход:

{"'CHW'": 1552.228925324831, "'LAD'": 1554.1437268304624, "'MIN'": 1475.9778073075058} 

Update:

Для чтения из текстового файла используйте эту функцию:

def read_text_file(filename): 
    with open(filename) as file_object: 
     result = file_object.read() 

    return result 

teams_txt = read_text_file('teams.txt') 
+0

Это работало так, как ожидалось. Теперь мне придется изменить его, чтобы прочитать файл teams.txt, но это не должно быть слишком плохо. Благодаря! – Ike348

+0

@ Ike48 Не забудьте принять ответ, который сработал для вашей ситуации. – Kyrubas

+0

@Kyrubas Как открыть файл, чтобы он был отформатирован так, как будто у вас есть команда «teams_txt»? Я попробовал 'text_content = open ('teams.txt'). Readlines()', но он дал мне объект «AttributeError:» list не имеет атрибута «split». – Ike348

0

Вместо того, чтобы нарушать цикл, пройдите его и смените ключ для franchID.
Учитывая dic ваш базовый словарь (в вашем примере, {'"WS1"': 1475.9778073075058, '"BRO"': 1554.1437268304624, '"CHA"': 1552.228925324831}) и с помощью кода, вы можете сделать:

def franch(year,team_str): 
    team_str=str(team_str) 
    with open('teams.txt') as imp_file: 
     teams=imp_file.readlines() 
    for team in teams: 
     (yearID,teamID,franchID)=team.split(',') 
     yearID=int(yearID) 
     if yearID==year: 
      if teamID==team_str: 
       #Found 
       dic[franchID] = dic[teamID] 
       del dic[teamID] 

Эта часть кода

dic[franchID] = dic[teamID] 
del dic[teamID] 

Будет ли удалить «изменить» teamID для franchID, создав новую запись с идентификатором franchID и удалив старую запись, поэтому выход будет

{'"MIN"': 1475.9778073075058, '"LAD"': 1554.1437268304624, '"CHW"': 1552.228925324831} 

, как ожидалось.

Если вы хотите сохранить старый словарь, вам не нужно удалять ключ. Просто сделайте

dic2[franchID] = dic1[teamID] 

и вы получите два словаря. Просто объявите dic2 = dict(), чтобы не получить NameError.

+0

Спасибо, но что я реализую в другой функции, который возвращает исходный словарь? – Ike348

+0

@ Ike348 После того как другая функция будет закончена, у вас будет такой словарь, как '{'" WS1 "': 1475.9778073075058, '" BRO "': 1554.1437268304624, '" CHA "': 1552.228925324831}', правильно? Итак, вы просто запустите эту другую функцию, которая построит второй словарь, __OR__ добавьте код для этой функции в конце первой функции :) – RafaelC

+0

ОК, спасибо. Я определял эту функцию перед функцией, которая создавала словарь, потому что так я и раньше это делал. Я дам вам знать, когда у меня появится шанс исправить это. – Ike348

0

Вы можете попробовать что-то вроде:

#!/usr/bin/env python 

def clean(_str): 
    return _str.strip('"').strip("'") 

first = {'"WS1"': 1475.9778073075058, '"BRO"': 1554.1437268304624, '"CHA"': 1552.228925324831} 

clean_first = dict() 
second = dict() 

for k,v in first.items(): 
    clean_first[clean(k)] = v 

with open("teams.txt", "r") as _file: 
    lines = _file.readlines() 
    for line in lines: 
     _,old,new = line.split(",") 
     second[new.strip()] = clean_first[clean(old)] 

print second 

Что дает ожидаемый:

{"'CHW'": 1552.228925324831, "'LAD'": 1554.1437268304624, "'MIN'": 1475.9778073075058} 
+0

Это вернуло «KeyError:« BS1 »в' second [new.strip()] = clean_first [clean (old)] '. Кроме того, я не думаю, что это учитывает год, который изменит исходные ключи, а также выход. – Ike348

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