Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 28, 2016 05:11:08

oreol
Зарегистрирован: 2016-07-03
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Массовое присвоение из массива в цикле?

Пишу консольное приложение.
У меня есть много переменных, которым нужно присвоить значения (int, str). Возникла идея это сделать с помощью цикла for, но я не знаю как это реализовать.
Собственно идея выглядит вот так (в текущем варианте не работает):

 #массив переменных
b= None
c = None
d = None
a = [b, c, d]
#цикл для массового присв.
for i in a:
    i = str(i)
print('b: {}, c: {}, d: {}'.format(b, c, d))
Результат работы:
b: None, c: None, d: None
Само собой, код не работает как нужно. И проблема в том, что при выполнении цикла ‘i’ не становится переменной, а только ссылается на объект переменной находящейся в списке ‘a’. А при присваивании ей значения (i = str(i)), теряет даже связь с объектом. Но наверняка есть другие (рабочие) способы массового присваивания через цикл?
Или все-таки выход только один - GUI (tkinter, kivy, etc)?

Отредактировано oreol (Окт. 28, 2016 09:23:12)

Офлайн

#2 Окт. 28, 2016 07:22:17

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Массовое присвоение из массива в цикле?

oreol
И проблема в том, что при выполнении цикла ‘i’
Помоему в трейсбеке ясно написано что у вас первая строка кода неправильная. До цикла тут вообще дело не доходит.

Если вы массово присваиваете одно значение None то почему не воспользоваться одной переменной?

Приведите пример как вы собираетесь это использовать, без этого вам ничего и не посоветуешь. Сейчас ваш код не делает ничего полезного.



Офлайн

#3 Окт. 28, 2016 09:03:44

oreol
Зарегистрирован: 2016-07-03
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Массовое присвоение из массива в цикле?

doza_and
Если вы массово присваиваете одно значение None то почему не воспользоваться одной переменной?

Приведите пример как вы собираетесь это использовать, без этого вам ничего и не посоветуешь. Сейчас ваш код не делает ничего полезного.
Переменным присваивается None, чтобы в цикле (который работает со списком а) не ругался интерпретатор. Может, я неправильно задал вопрос.
Суть задачи: Есть много переменных (a, b, c, …, z). Нужно всем им передать индивидуальные значения из input. Если по очереди получать значения, то код становится громоздким (постоянно повторяются строки с input):
 print('Введите значение переменной а')
 a = input('..')
 ...
 print('введите значeние переменной z')
 z = input('..')
И возникает вопрос, можно ли что-то подобное сделать с помощью цикла по такой схеме:
n = a, b,c, … z
цикл
n(i) = ввод с клавиатуры
Результат: пользоватлем присвоены индивидуальные значения для всех переменных

Отредактировано oreol (Окт. 28, 2016 10:02:40)

Офлайн

#4 Окт. 28, 2016 11:04:58

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2785
Репутация: +  185  -
Профиль   Отправить e-mail  

Массовое присвоение из массива в цикле?

Не нужно циклов.

 >>> locals().update({"a":1, "b":2, "c":3})
>>> a
1
>>> b
2
>>> c
3



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#5 Окт. 28, 2016 11:41:04

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9932
Репутация: +  856  -
Профиль   Отправить e-mail  

Массовое присвоение из массива в цикле?

oreol
И возникает вопрос, можно ли что-то подобное сделать с помощью цикла по такой схеме:
n = a, b,c, … z
цикл
n(i) = ввод с клавиатуры
Результат: пользоватлем присвоены индивидуальные значения для всех переменных
Надо просто список сделать, и туда через append() добавлять результат каждого input().
  
>>> lst = []
>>> 
>>> for i in range(3):
...     s = input('enter: ')
...     lst.append(s)
... 
enter: a
enter: b
enter: c
>>> 
>>> lst
['a', 'b', 'c']
>>>
>>> a, b, c = lst
>>> 
>>> a
'a'
>>> b
'b'
>>> c
'c'
>>>



Отредактировано py.user.next (Окт. 28, 2016 11:41:57)

Офлайн

#6 Окт. 28, 2016 16:26:04

oreol
Зарегистрирован: 2016-07-03
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Массовое присвоение из массива в цикле?

Rodegast
Не нужно циклов.
Большое спасибо. Отличный способ.
Решил протестировать, но возникает проблема.
Код:
 my_dictionary = {}                              #создаю словарь my_dictionary
variables_list = ["a", "b", "c", "d", "e"]      #список содержащий имена будущих переменных и порядок ввода
for i in variables_list:                        #цикл перебора содержимого списка variables_list
    print('Введите: {}'.format(i))              #форматированный вывод текста с указанием что пользователь должен ввести
    user_input = input('..')                    #input
    my_dictionary[i] = user_input               #создается ключ 'i' с введенным значением
print('Содержимое словаря:', my_dictionary)     #проверка содержимого словаря my_dictionary
locals().update(my_dictionary)                  #!здесь затаилась ошибка
print('a: {a}, b: {b}, c: {c}, d: [d], e: {e}'.format(a, b, c, d, e))   #попытка вывести значения переменных
Результат работы (ошибка):
Введите: a
..1
Введите: b
..2
Введите: c
..3
Введите: d
..4
Введите: e
..5
Содержимое словаря: {'b': ‘2’, ‘c’: ‘3’, ‘a’: ‘1’, ‘e’: ‘5’, ‘d’: ‘4’}
Traceback (most recent call last):
File “*/MyTest.py”, line 9, in <module>
print('a: {a}, b: {b}, c: {c}, d: , e: {e}'.format(a, b, c, d, e))
KeyError: ‘a’

Process finished with exit code 1
Прямо волшебство) не работает:
 locals().update(my_dictionary)
но в таком случае все в порядке:
 locals().update({'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5})
Есть ли способ с помощью функции locals() создавать переменные из готового словаря ‘my_dictionary’?

Отредактировано oreol (Окт. 28, 2016 16:39:14)

Офлайн

#7 Окт. 29, 2016 00:17:39

wallet
Зарегистрирован: 2016-02-21
Сообщения: 50
Репутация: +  2  -
Профиль  

Массовое присвоение из массива в цикле?

oreol

Попробуйте так, если я правильно понял, что требуется

 a = ['name','age','sex']
dic={}
def pris(i):
   v = raw_input("What is your " + str(i)+ ' ')
   dic[i]= v
   print dic
for i in a:
   pris(i)
print dic['name']

на выходе
 {'age': '100', 'name': 'wallet', 'sex': 'man'}

Офлайн

#8 Окт. 29, 2016 02:20:46

oreol
Зарегистрирован: 2016-07-03
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Массовое присвоение из массива в цикле?

wallet
на выходе
{'age': ‘100’, ‘name’: ‘wallet’, ‘sex’: ‘man’}

Проблема в том, что это почему-то не работает
oreol
my_dictionary = {'a': 1, ‘b’: 2, ‘c’: 3, ‘d’: 4, ‘e’: 5}
locals().update(my_dictionary)
А такая форма работает
oreol
locals().update({'a': 1, ‘b’: 2, ‘c’: 3, ‘d’: 4, ‘e’: 5})

Хотелось бы получить возможно передавать методу .update() переменную ссылающуюся на объект (а не так locals().update({'a': 1, ‘b’: 2, ‘c’: 3, ‘d’: 4, ‘e’: 5}))

Отредактировано oreol (Окт. 29, 2016 02:23:53)

Офлайн

#9 Окт. 29, 2016 02:23:06

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Массовое присвоение из массива в цикле?

oreol
Вы не правильно поняли где у вас ошибка - именно в форматировании строки. Сделайте так:

 print('a: {a}, b: {b}, c: {c}, d: {d}, e: {e}'.format(**locals())
это тоже самое что и
 print('a: {a}, b: {b}, c: {c}, d: {d}, e: {e}'.format(a=a, b=b, c=c, d=d, e=e))
Еще один способ это явное указание
 print('a: {}, b: {}, c: {}, d: {}, e: {}'.format(a, b, c, d, e))



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Отредактировано JOHN_16 (Окт. 29, 2016 02:23:39)

Офлайн

#10 Окт. 29, 2016 02:30:32

oreol
Зарегистрирован: 2016-07-03
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Массовое присвоение из массива в цикле?

JOHN_16
Вы не правильно поняли где у вас ошибка - именно в форматировании строки. Сделайте так:
Большое спасибо! Помогло.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version