有什么方法可以从字符串值中提取变量名吗?

时间:2012-02-26 13:49:05

标签: python python-3.x

我有三个清单。根据用户交互,这些列表可能对用户可用或不可用,我设置它的方式是通过第四个列表跟踪列表名称和状态。但是当我尝试使用第四个列表中的字符串值来访问我的其他列表时,我遇到了麻烦。

也就是说,我想将可用列表中的所有字符串添加到主列表中 - 我应该怎么做呢?

domesticated = ['cow', 'sheep', 'pig']
pets = ['cat', 'dog']
wildlife = ['giraffe', 'lion', 'panda']

masterList = ['domesticated', 'pets', 'wildlife'],  ['off', 'on', 'on']

def currentLists():
    activeList = ''
    for i in range(len(masterList[0])):
        if masterList[1][i] == 'on':
            activeList = activeList + masterList[0][i]
    return activeList

当前输出:

petswildlife

期望的输出:

['cat', 'dog', 'giraffe', 'lion', 'panda']

我为任何困惑道歉,我是Python的初学者。非常感谢任何帮助。

3 个答案:

答案 0 :(得分:4)

您应该用一个domesticated替换三个变量petswildlifedict

animals = {'domesticated': ['cow', 'sheep', 'pig'],
           'pets': ['cat', 'dog'],
           'wildlife': ['giraffe', 'lion', 'panda']}

然后

activeList = []  # not ''!
for category, status in zip(*masterList):
    if status == 'on':
        activeList += animals[category]

请注意zip(*masterList),这与zip(masterList[0], masterList[1])相同。使用zip和两个循环变量是同时循环两个列表的惯用方法。

对于额外的Python点,您可以使用sum附加列表:

sum((animals[category] for category, status in zip(*masterList)
                       if status == 'on'),
    [])

答案 1 :(得分:0)

您不应该使用字符串,而应该使用变量本身。我还将脚本更改为使用zipzip([1, 2, 3], [4, 5, 6]) == [(1, 4), (2, 5), (3, 6)]。你...用它拉链序列。

domesticated = ['cow', 'sheep', 'pig']
pets = ['cat', 'dog']
wildlife = ['giraffe', 'lion', 'panda']

masterList = zip([domesticated, pets, wildlife],  ['off', 'on', 'on'])

def currentLists():
    activeList = []
    for e in masterList:
        if e[1] == 'on':
            activeList += e[0]

    return activeList

答案 2 :(得分:0)

尽管Gandaro's good advice,但可以按名称检索变量

vars()globals()locals()个功能。 所以,如果你想直接修复它,你可以这样做:

domesticated = ['cow', 'sheep', 'pig']
pets = ['cat', 'dog']
wildlife = ['giraffe', 'lion', 'panda']

masterList = ['domesticated', 'pets', 'wildlife'],  ['off', 'on', 'on']

def currentLists():
    activeList = []
    for i in range(len(masterList[0])):
        if masterList[1][i] == 'on':
            activeList = activeList + globals()[masterList[0][i]]
    return activeList