Найти - Пользователи
Полная версия: Массовое присвоение из массива в цикле?
Начало » Python для новичков » Массовое присвоение из массива в цикле?
1
oreol
Пишу консольное приложение.
У меня есть много переменных, которым нужно присвоить значения (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)?
doza_and
oreol
И проблема в том, что при выполнении цикла ‘i’
Помоему в трейсбеке ясно написано что у вас первая строка кода неправильная. До цикла тут вообще дело не доходит.

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

Приведите пример как вы собираетесь это использовать, без этого вам ничего и не посоветуешь. Сейчас ваш код не делает ничего полезного.
oreol
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) = ввод с клавиатуры
Результат: пользоватлем присвоены индивидуальные значения для всех переменных
Rodegast
Не нужно циклов.
 >>> locals().update({"a":1, "b":2, "c":3})
>>> a
1
>>> b
2
>>> c
3
py.user.next
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'
>>>
oreol
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’?
wallet
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'}
oreol
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}))
JOHN_16
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))
oreol
JOHN_16
Вы не правильно поняли где у вас ошибка - именно в форматировании строки. Сделайте так:
Большое спасибо! Помогло.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB