2013-11-10 2 views
-1

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

Каждая строка в тексте будет иметь имя пользователя, имя, фамилию, возраст, пол и адрес электронной почты. Функция будет вставлять информацию каждого человека в словарь со своим именем пользователя в качестве ключа, а значение - список [фамилия, имя, адрес электронной почты, возраст, пол].

в основном то, что им пытаются сделать, это открыть текстовый файл, который содержит следующее:

  ajones Alice Jones 44 F [email protected] 

и вернуть что-то вроде этого:

  {ajones: ['Jones', 'Alice', '[email protected]', 44, 'F']} 

до сих пор я сделал это, но есть ли другой более простой способ?

def create_dict(file_name): 
    '''(io.TextIOWrapper) -> dict of {str: [str, str, str, int, str]} 

    ''' 
    newdict = {} 
    list2 = [] 
    for line in file_name: 
     while line: 
      list1 = line.split() #for a key, create a list of values 
    if list2(0): 
     value += list1(1) 
    if list2(1): 
     value += list1(2) 
    if list2(2): 
     value += list1(3) 
    if list2(3): 
     value += list1(4) 
    newdict[list1(0)] = list2 

    for next_line in file_name: 
     list1 = line.split() 
     newdict[list1(0)] = list1 
    return newdict 


def helper_func(fieldname): 
    '''(str) -> int 
    Returns the index of the field in the value list in the dictionary 
    >>> helper_func(age) 
    3 

    ''' 

    if fieldname is "lastname": 
     return 0 
    elif fieldname is "firstname": 
     return 1 
    elif fieldname is "email": 
     return 2 
    elif fieldname is "age": 
     return 3 
    elif fieldname is "gender": 
     return 4 
+4

Ваш код не верный, вы используете '()' вместо '[]' on 'list1' для индексирования. И оператор 'is' используется для проверки личности, а не равенства. –

+0

также значение не определено здесь, поэтому оно вызывает ошибку на 'value + = ...' –

+0

, это может быть лучше подходит для http://codereview.stackexchange.com/ – dm03514

ответ

0
for line in file_name: 
     lineData = line.split() #for a key, create a list of values 
     my_dict[lineData[0]] = lineData[1:] 

немного проще я думаю ... хотя Im не уверен, если тот делает то, что вы хотите ...

+0

Это будет циклически навечно на 'while line', хотя Думаю, пример тоже сделал это. – lunixbochs

+0

да, мой плохой для копирования/вставки ... там исправлено –

0

Есть, конечно, более простой способ построить свой словарь:

d={} 
st='ajones Alice Jones 44 F [email protected]' 
li=st.split() 
d[li[0]]=li[1:] 

print d 
# {'ajones': ['Alice', 'Jones', '44', 'F', '[email protected]']} 

Если вы хотите изменить порядок полей, сделайте это при их хранении:

d={} 
st='ajones Alice Jones 44 F [email protected]' 
li=st.split() 
li2=li[1:] 
d[li[0]]=[li2[i] for i in (1,0,4,3,2)] 

print d 
# {'ajones': ['Jones', 'Alice', '[email protected]', 'F', '44']} 

Или просто используйте именованные кортежи или словарь, а не список для полей данных.

Один у вас есть эта часть правильно, вы можете использовать его с вашим файлом:

# untested... 
def create_dict(file_name): 
    newdict = {} 
    with open(file_name) as fin: 
     for line in fin: 
      li=line.split() 
      li2=li[1:] 
      li2[2]=int(li[2]) 
      newdict[li[0]]=[li2[i] for i in (1,0,4,3,2)] 

    return newdict  
+0

@ user2976886: Просто попробуйте функцию, которую я написал с вашим именем файла. – dawg

+0

'(1,0,4,3,2)' - это то, как вы переупорядочиваете поля до 'last, first, email, gender, age' Это индекс первого списка, считанного из файла – dawg

+0

Я использую методы в первых двух частях функции. Нет, вам не нужно вводить их - просто используйте функцию 'create_dict' и посмотрите, работает ли это. Дым не выйдет из компьютера, если он не работает ;-) – dawg

0

согласен с первым ответ, вот немного другая версия, соответствующая спецификации:

file=open('filename', 'r') 
{username: [lname, fname, email, int(age), sex] for username, fname, lname, age, sex, email in (line.rstrip().split(' ') for line in file)} 
Смежные вопросы