【问题标题】:Any way to extract a variable name from a string value?有什么方法可以从字符串值中提取变量名?
【发布时间】:2012-02-26 13:49:04
【问题描述】:

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

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

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 的初学者。非常感谢任何帮助。

【问题讨论】:

  • 使用像动物这样的字典 = {"pets":['cat','doc']};动物[“宠物”]。忘记使用 globals() 和 locals()。

标签: python python-3.x


【解决方案1】:

您应该将三个变量 domesticatedpetswildlife 替换为单个 dict

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'),
    [])

【讨论】:

    【解决方案2】:

    您不应使用字符串,而应使用变量本身。我还将脚本更改为使用zip:zip([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
    

    【讨论】:

      【解决方案3】:

      尽管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
      

      【讨论】:

      • 我不建议新手程序员使用varsglobalslocals
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-06
      • 2022-08-19
      • 2019-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多