【问题标题】:Python - How can I call the variable contents instead of its name using the .format() method?Python - 如何使用 .format() 方法调用变量内容而不是其名称?
【发布时间】:2019-10-30 17:48:37
【问题描述】:

我正在尝试从这些列表中创建一个矩阵:

list_1 = [0, 1, 2]
list_2 = ["3", "4", "5"]
list_3 = [6.0, 7.0, 8.0]
matrix = []

我正在使用下面的代码,但它返回一个错误,因为它将“list_1”作为字符串而不是变量的名称:ValueError: invalid literal for int() with base 10: 'list_1'

for i in range(3):
    matrix.append([])
    for j in range(1,4):
        matrix[i].append(int('list_{0}'.format(j))[i])

我们将不胜感激。

【问题讨论】:

  • 你能举个例子说明输出应该是什么样子吗?
  • 一开始就不要创建这样的变量。如果您正在创建一组以一系列递增数字命名的变量,则意味着您实际上应该创建一个列表。
  • 谢谢,@blhsing。这是练习的一部分,我以这种方式获得了变量。另一种解决方案是将它们转换为单个列表。
  • @bartcubrich,结果应该是:matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

标签: python-3.x string list matrix


【解决方案1】:

尝试使用eval() 方法以及附加str() 方法来获取变量名。

替换此行

matrix[i].append(int('list_{0}'.format(j))[i])

用这一行:

matrix[i].append(int(eval('list_'+str(j))[i]))

print(matrix)的输出:

[[0, 3, 6], [1, 4, 7], [2, 5, 8]]

【讨论】:

  • 太棒了!但是,您可能想要编辑您的代码,正如我从您的评论中看到的那样,此输出不正确。
【解决方案2】:

您可以使用getattr 将变量名称作为字符串获取代码中的变量。文档说您可以通过这种方式获取对象的成员,但模块也是对象。

您可以通过sys.modules 字典获取模块对象。 (文档似乎建议您将其用作只读。)关键是模块的名称,它方便地存储在__name__

所以下面的命令行对我有用:

>>> import sys
>>> list_1 = [0, 1, 2]
>>> int(getattr(sys.modules[__name__], 'list_1')[0])
0
>>> int(getattr(sys.modules[__name__], 'list_1')[1])
1
>>> 

【讨论】:

    【解决方案3】:

    现在我知道用户想要什么,这是一个简单的单行版本。

    list_1 = [0, 1, 2]
    list_2 = ["3", "4", "5"]
    list_3 = [6.0, 7.0, 8.0]
    
    
    matrix=[[int(x) for x in list_1],[int(x) for x in list_2],[int(x) for x in list_3]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多