Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Python] Ввод данных


Автор: Paranorma 8.8.2007, 23:54
 smile 
Очень нужна помощь. Задание такое: вводится информация о людях в таком формате - имя, фамилия, пол, профессия, после ввода задается вопрос продолжать ввод или нет.
Насколько я поняла препода, программа будет работать так:
вылезает подсказка "имя", ввожу имя, потом в raw_input появляется подсказка "фамилия", ввожу фамилию, появляется подсказка "профессия", ввожу профессию, потом подсказка "пол", указываю пол, наконец, появляется вопрос остановить ли ввод. Ответ "да" или "нет". И этот вопрос должен появляться после ввода инфы о каждом человеке. Вся инфа о людях должна запихиваться в словарь, потом добавляться в список. От препода четкого объяснения не добилась, но и словарь и список тут точно будут использованы. Рспечатываться будет так:
Лоскутова  Нина    жен студентка
Мицкевич  Артур   муж программист
Котов        Михаил муж студент

То есть вся инфа в 4 столбика, буковка под буковкой, столбики все выравниваем, ясно, что будет использован оператор формата %
И еще: пожалуйста, если можно, то напишите без использования оператора lambda. Я его не изучала, о его использовании знаю поверхностно. Всем заранее спасибо.

Автор: doomik 9.8.2007, 02:13
Код

dataDict = {}
dataList = []

def AddToDict(dataDict, firstName, lastName, gender, profession):    # загружаем данные в словарь
    dataDict[lastName] = {}
    dataDict[lastName]['First Name'] = firstName
    dataDict[lastName]['Gender'] = gender
    dataDict[lastName]['Profession'] = profession


def AddToList(dataDict, dataList): # загружаем данные из словаря в лист
    for i in dataDict.iterkeys():
        dataList.append(i)
        dataList.append(dataDict[i]['First Name'])
        dataList.append(dataDict[i]['Gender'])
        dataList.append(dataDict[i]['Profession'])

 def PrintData(dataList): # печатаем данные
    j = 1
    for i in dataList:
        print i,
        if j % 4 == 0: # каждые 4 раза будет печататся новая строка
            print '\n'
        j += 1

# main
# вводим данные
while True:
    firstName = raw_input("Enter first name: ")
    lastName = raw_input("Enter last name: ")
    gender = raw_input("Enter your gender: ")
    profession = raw_input("enter you profession:")
    choice = raw_input(r"Do you wish to continue: ? (y\n): ")
    AddToDict(dataDict,firstName,lastName,gender,profession,)
    if choice == 'n':
        break


AddToList(dataDict, dataList)
PrintData(dataList)

Не доработал правльный вывод данных ( с % )  т.к не помню как он работает smile 

в словаре данные хранятся в таком образе;
Код

dataDict = {
   'Фамилия1' : {
                         'Имя': 'ТутИмя'
                         'Пол': 'ТутПол'
                         'Профессия ' : ' ТутПрофессия '
     .
     .
     .
                         }
}

Автор: Paranorma 9.8.2007, 12:17
Спасибо, с процентом я соображу. smile 

Автор: Guedda 9.8.2007, 12:20

M
Guedda
Модератор: Не забываем отмечать вопрос решенным!

Автор: Paranorma 10.8.2007, 00:53
Да, вопрос увы, не решен еще. 

doomik, не хотела вас расстраивать, но вариант этот не работает. И дело не в том, что ф-ции не связанны меж собой оператором return... Я это сама дописать могу. Сегодня, наконец-то добилась от препода нормального объяснения:
Программа должна работать так:
while True: # это первый цикл
   Ввести данные о человеке и запомнить их.
   Спросить надо ли продолжить ввод # Это второй цикл
   if not продолжить:
     break
 
Данные о каждом человеке запоминаются в словаре, словари 
в свою очередь сохраняются в списке. Печать нас пока не 
интересует, можете печатать как хотите, исключительно
для отладочных целей.

Начало, я так понимаю, будет таким:
Код

lst = []
dict = {}
while True:
    s = raw-input("Enter information")
    if not s:
        break
    lst.append(s)

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

Автор: doomik 10.8.2007, 01:44
Paranorma,
Цитата
Спросить надо ли продолжить ввод # Это второй цикл

А зачем спициальный цикл для вопроса 'Продолжить ввод ?'  smile 
Кстати можно и на 'ты' хотя это как вы хотите.

Цитата
Сегодня, наконец-то добилась от препода нормального объяснения:

А что в первый раз он не хотел обьяснять ? интересно а тогда  он то знал что хотел сказать  smile 

Вариант без функцей:
Код

dataDict = {}
dataList = []
# main
# вводим данные
while True:
    firstName = raw_input("Enter first name: ")
    lastName = raw_input("Enter last name: ")
    gender = raw_input("Enter your gender: ")
    profession = raw_input("enter you profession:")
    dataDict[lastName] = {}
    dataDict[lastName] = {'First name': firstName, 'Gender': gender, 'Profession': profession } # добавляем данные в словарь
    choice = raw_input(r"Do you wish to continue: ? (y\n): ")
    if choice == 'n':
        break

for i in dataDict.iterkeys():# проходим по словарю и добавляем данные из словаря в лист
    s = str(i) + ': ' + str(dataDict[i]) 
    dataList.append(s)


print dataList, '\n'
print dataDict



Как можно увидить и без вложеных циклов обошлось.  smile 

Автор: Damarus 10.8.2007, 13:26
Цитата(doomik @  10.8.2007,  02:44 Найти цитируемый пост)
А зачем спициальный цикл для вопроса 'Продолжить ввод ?' 

ИМХО, чтобы обрабатывать не верный ответ.

Автор: Paranorma 24.8.2007, 21:16
Я немного видоизменила программу, так как назначение некоторых строк мне было непонятно.
Код

dataDict = {}
dataList = []
while True:
    firstName = raw_input("Enter first name: ")
    lastName = raw_input("Enter last name: ")
    gender = raw_input("Enter your gender: ")
    profession = raw_input("enter you profession:")
    dataDict[lastName] = {'First name': firstName, "Last name" : lastName, 'Gender': gender, 'Profession': profession }
    choice = raw_input(r"Do you wish to continue: ? (y\n): ")
    if choice == 'n':
        break
for i in dataDict.keys():
    s = str(i) + ': ' + str(dataDict[i]) 
    dataList.append(s)
print dataList, '\n'

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

Вы вводите данные о человеке и создаете из них словарь
{'First name': firstName, ...}
именно этот словарь и надо сохранить в dataList.

То есть получается инфа об одном человеке - 1 словарь, инфа о другом - другой словарь, но все они сохраняются в списке. Этот вариант, что написал doomik как раз и работает подобным образом.
Код

["joy: {'First name': 'joy', 'Profession': 'joy', 'Gender': 'joy'}", "werty: {'First name': 'terry', 'Profession': 'werty', 'Gender': 'werty'}"] 

Но в своем варианте я как всегда упустила какую-то тонкость и у меня нет здесь фамилии. К тому же схематически должно выглядеть так, как я понимаю:
[{инфо о 1 человеке}, {инфо о 2 человеке}, {инфо о 3 человеке}] 
а тут распечатывается, как ["joy: {'First name': 'joy', 'Profession'.... то есть немного не так. Я поняла, что такой результат происходит и-за этой строки
  
Код

dataDict[lastName] = {'First name': firstName, "Last name" : lastName, 'Gender': gender, 'Profession': profession }

Как мне все это переделать, чтоб не было ["joy: а после  квадратной скобки сразу шла фигурная...
Помогите, плиз... Очень важно.

Автор: setq 24.8.2007, 22:45
Возможно тебе(вам) имеет смысл отказаться от добавления записей в dataDict и сразу заталкивать словарь {'First name': ... и т.д } в dataList? Например методом .append(...) .

Второй вариант, вместо последнего цикла for написать
Код

dataList = dataDict.values()

Автор: Paranorma 7.9.2007, 17:54
Помогите, плиз!
Хоть поясните, что я опять упустила?
Мы с преподом уговорились, что задачу можно оставить в таком виде.
Код

dataList = []
while True:
    firstName = raw_input("Enter first name: ")
    lastName = raw_input("Enter last name: ")
    gender = raw_input("Enter your gender: ")
    profession = raw_input("enter you profession:")
    dataList.append({'First name': firstName, 'Last name':lastName, 'Gender':gender, 'Profession': profession })

    choice = raw_input("Do you wish to continue: ? (y\n): ")
    if choice == 'n':
        break
print dataList

 Сегодня получила задание чуточку видоизменить это задание.

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


По идее тогда должно начинаться как-то так

Код

def main(firstName, lastName, gender, profession):
    firstName = raw_input("Enter first name: ")
    lastName = raw_input("Enter last name: ")
    gender = raw_input("Enter your gender: ")
    profession = raw_input("enter you profession:")


Но куда и как дальше двигаться? сбивает с толку фраза Функция должна вызываться в цикле, а результат
вызова должен добавляться к списку dataList


Был еще и такой бредовый вариант, но я и сама вижу, что не очень-то он условию соответствует.

Код

def main(firstName, lastName, gender, profession):
    firstName = raw_input("Enter first name: ")
    lastName = raw_input("Enter last name: ")
    gender = raw_input("Enter your gender: ")
    profession = raw_input("enter you profession:")
    return {'First name': firstName, 'Last name':lastName, 'Gender':gender, 'Profession': profession}

def func (dataList):
    dataList = []
    dataList.append({'First name': firstName, 'Last name':lastName, 'Gender':gender, 'Profession': profession })
    choice = raw_input("Do you wish to continue: ? (y\n): ")
    if choice == 'n':
        break
print func (dataList)


Подскажите, хоть что-нибудь. smile 

Автор: doomik 7.9.2007, 19:24
Paranorma,

Цитата

По идее тогда должно начинаться как-то так
Код

def main(firstName, lastName, gender, profession):
    firstName = raw_input("Enter first name: ")
    lastName = raw_input("Enter last name: ")
    gender = raw_input("Enter your gender: ")
    profession = raw_input("enter you profession:")


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


Цитата

Но куда и как дальше двигаться? сбивает с толку фраза Функция должна вызываться в цикле, а результат
вызова должен добавляться к списку dataList

Т.е твоя функция main ( она играет роль чтения данных ) вызывается в цикле while, а её результат помещается в массив.


вот полный код:

Код

def main():
    firstName = raw_input("Enter first name: ")
    lastName = raw_input("Enter last name: ")
    gender = raw_input("Enter your gender: ")
    profession = raw_input("enter you profession:")
    return {'First name': firstName, 'Last name':lastName, 'Gender':gender, 'Profession': profession}

dataList = []
while True:
    dataList.append(main()) # сохраняем результат функции main в массив
    choice = raw_input("Do you wish to continue: ? (y\n): ")
    if choice == 'n':
        break

print dataList


Автор: Paranorma 7.9.2007, 21:18
 smile 
Спасибо!!!

Автор: Paranorma 12.9.2007, 20:11
Препод мой сновавсем недоволен... А я уже просто не понимаю, как все это записать. Его спрашивала. Он говорит, это все изученный мною материал, должна справиться, но все равно ничего не понимаю
Вот чего он пишет мне, что функция должна иметь параметр:
def inputPersonData( infoList )
   # У функции всего один параметр !!!!!!!!!!!!!!!!
   # infoList - список названий данных которые нас интересуют
   # например: ("firstName", "lastName", "gender", "profession")
   # или: ("personal number", "address")
   # Функция вызывается так:
   # res = inputPersonData( ("firstName", 
                             "lastName",
                             "gender",
                             "profession")
                          )
   # функция запрашивает у пользователя данные перечисленные
   # infoList и в качестве результата возвращает словарь
   # в котором строки перечисленные infoList вляются ключами.
   

Код

def inputPersonData(infoList):
    pData = {}
    i = 0
    while(i < len(infoList)):
        pData[infoList[i]] = raw_input("Enter "+infoList[i]+":")
        i = i + 1
    return pData
dataList = []
dataList.append(pData)
choice = raw_input("Do you wish to continue: ? (y\n): ")
if choice == 'n':
    break

res = inputPersonData(("firstName", "lastName", "gender", "profession"))
print res

а вот это уже я навертела, но не работает.В чем проблема? почему прога ругается на строку append? Почему пишет, что pData не существует? понятно, что это локальная переменная, но я же для того и return использовала. 
HELP!!! SOS!!! СРОЯНО НУЖНО!!!
ВСЕМ ЗАРАНЕЕ СПАСИБО.
Конечно, ориентироваться надо не на мой кривой вариант, а на то, что написал препод.

Автор: Paranorma 13.9.2007, 00:09
Параметром должен быть список названий полей
которые надо ввести на выходе должен быть словарь с введенными полями.
Функция должна вызываться в цикле, а результат
вызова должен добавляться к списку dataList.  

Вот еще из рекомендаций препода по этому же заданию.

Автор: doomik 13.9.2007, 03:57
Paranorma,
Цитата

В чем проблема? почему прога ругается на строку append? Почему пишет, что pData не существует? понятно, что это локальная переменная, но я же для того и return использовала. 

pData не существует  потому что не существует, ты сделала return pData  т.е функция возвращает значение и чтобы его не потерять мы его сохраняем в переменной. Если в return ты  возвращаеш pData тогда это незначит что  в главной программе она будет у тебя видна.


Код

res = inputPersonData(("firstName", "lastName", "gender", "profession"))
dataList.append(res)

 
В переменной res сохраняем результат функции а потом добавляем его в список.

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



Код

def inputPersonData(infoList):
    d = {}
    firstName = raw_input("Enter first name:")
    lastName = raw_input("Enter last name:")
    gender = raw_input("Enter gender:")
    prof = raw_input("Enter profession:")
    d[firstName] = {}
    for i in infoList: # добавляем параметры в словарь ( получается вложенный словарь )
        d[firstName][i] = lastName #  { 'myname': {'lastName': 'mylast', 'gender: 'mygen', 'prof': 'myprof'  } }
        d[firstName][i] = gender
        d[firstName][i] = prof
    return d

dataList = []
infoList = ('firstName', 'lastName', 'Gender', 'Profession')
choice = ''

while choice != "y":
    res = inputPersonData(infoList)
    dataList.append(res) # результат функции добавляется в dataList
    choice = raw_input("Quit ? y/n:")

print dataList   

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)