Вопрос по python, variables, arrays, list, multidimensional-array – Список Python как имя переменной

3

Я играл с Python, и у меня есть этот список, который мне нужен. В основном я набираю список игр в многомерном массиве, а затем для каждой из них создается 3 переменные на основе этой первой записи.

Массив, который сделан:

Applist = [
['Apple', 'red', 'circle'],
['Banana', 'yellow', 'abnormal'],
['Pear', 'green', 'abnormal']
]

Для цикла назначить каждому фрукту имя, цвет и форму.

for i in Applist:
    i[0] + "_n" = i[0]
    i[0] + "_c" = i[1]
    i[0] + "_s" = i[2]

Однако при этом я получаю сообщение о невозможности присвоить оператору сообщение. Как с этим бороться?

Ожидаемый результат будет:

Apple_n == "Apple"
Apple_c == "red"
Apple_s == "circle"

И т.д. для каждого фрукта.

Вы хотите напечатать это? Froyo

Ваш Ответ

2   ответа
18

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

variables = {}
for name, colour, shape in Applist:
    variables[name + "_n"] = name
    variables[name + "_c"] = colour
    variables[name + "_s"] = shape

Теперь доступ к ним какvariables["Apple_n"], так далее.

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

variables = {}
for name, colour, shape in Applist:
    variables[name] = {"name": name, "colour": colour, "shape": shape}

print "Apple shape: " + variables["Apple"]["shape"]

Или, может быть, даже лучше,namedtuple:

from collections import namedtuple

variables = {}
Fruit = namedtuple("Fruit", ["name", "colour", "shape"])
for args in Applist:
    fruit = Fruit(*args)
    variables[fruit.name] = fruit

print "Apple shape: " + variables["Apple"].shape

Вы не можете изменять переменные каждогоFruit если вы используетеnamedtuple хотя (то есть без настройкиvariables["Apple"].colour в"green"), так что, возможно, это не очень хорошее решение, в зависимости от предполагаемого использования. Если вам нравитсяnamedtuple Решение, но хотите изменить переменные, вы можете сделать его полноценнымFruit вместо этого, который может быть использован в качестве замены дляnamedtuple Fruit в приведенном выше коде.

class Fruit(object):
    def __init__(self, name, colour, shape):
        self.name = name
        self.colour = colour
        self.shape = shape
Просто подумал, что скажу спасибо @lazyr за ответы на мои вторые вопросы;) Skowt
Спасибо @lazyr, это было очень быстрое решение :) У меня просто есть еще один вопрос ... если теперь у вас есть имя, цвет, форма в Applist: variable [name] = shape. Изменит ли это имя в Applist или это создаст новую переменную и не коснется Applist? Skowt
@SkowtApplist а такжеvariables после запуска этого кода они полностью независимы, и все, что сделано с одним из них, не повлияет на другое.
Хороший ответ....
2

Проще всего сделать это с помощью словаря:

app_list = [
    ['Apple', 'red', 'circle'],
    ['Banana', 'yellow', 'abnormal'],
    ['Pear', 'green', 'abnormal']
]
app_keys = {}

for sub_list in app_list:
    app_keys["%s_n" % sub_list[0]] = sub_list[0]
    app_keys["%s_c" % sub_list[0]] = sub_list[1]
    app_keys["%s_s" % sub_list[0]] = sub_list[2]

Похожие вопросы