Python中,使用列表的一个值重命名列表

Python中,使用列表的一个值重命名列表,python,Python,我需要在python中操作几个列表,并且我需要每个列表都使用它包含的第三个值的名称,但是我无法绕开它的语法 谢谢 编辑: 我正在为nagios编写一个插件,用于从mssql服务器提取数据,我需要为nagios perfdata格式化数据。 我已经完成了大部分工作,我只需要格式化数据 def main(): parser = optparse.OptionParser(usage=usage) parser.add_option("-H", "--host", dest="host", help

我需要在python中操作几个列表,并且我需要每个列表都使用它包含的第三个值的名称,但是我无法绕开它的语法

谢谢

编辑:

我正在为nagios编写一个插件,用于从mssql服务器提取数据,我需要为nagios perfdata格式化数据。 我已经完成了大部分工作,我只需要格式化数据

def main():

parser = optparse.OptionParser(usage=usage)
parser.add_option("-H", "--host", dest="host", help="hostname or ip address to check", default="localhost")
parser.add_option("-u", "--user", help="DB username", type="string")
parser.add_option("-p", "--password", help="DB password")
parser.add_option("-P", "--port", help="database port", default="1433")
parser.add_option("-d", "--database", help="Database to query")

(options, args) = parser.parse_args()

con_string = "DRIVER=FreeTDS;SERVER={0};PORT={1};UID={2};PWD={3};DATABASE={4}" . format(options.host,options.port,options.user,options.password,options.database)
try:
    con = pyodbc.connect(con_string)
except:
    print "CRITICAL: error connecting, wrong options or database may be down"
    print sys.exc_info()
    exit(2) # crtical

# if we are connected, let's fetch some data!    
cur = con.cursor()
cur.execute(query)
rows = cur.fetchall()
现在,我需要打印nagios perfdata的数据。我从不需要perfdata来拥有动态名称,所以我被卡住了

我通常会这样做:

print 'ramTotal={0:.2f}{1}' .format(ramTotal/1024,UOM)
但是我不能将第[3]行的值放在需要的地方

print 'row[3]={0:.1f}{1}' .format(row[0],row[1])
不起作用

all_my_lists = {} #USE A DICT!!!
all_my_list[listx[2]] = listx  #listx[2] gives the 3rd value in listx
我想这就是你要找的。。。如果你真的想设置变量名,你需要处理locals()和globals()。。。真恶心


我想这就是你要找的。。。如果你真的想设置变量名,你需要处理locals()和globals()。。。我同意其他评论者的观点,动态命名一个创建的变量通常不是一个好方法

但本着实际回答问题并相信作者(和读者)知道何时以及是否合适的精神,这是实现相同目标的另一种方法:

l1 = ['a', 'b', 'foo']
l2 = ['c', 'd', 'bar']
l3 = ['e', 'f', 'baz']

lists_to_rename = [l1, l2, l3]

for some_list in lists_to_rename:
    exec("%s = some_list"%(some_list[2]))

print foo, bar, baz

我再说一遍:我不赞成这样做;这几乎肯定不是解决你问题的正确方法。为了完整性和未来的引用能力,我喜欢尝试回答前面提到的问题。

我同意其他评论者的观点,动态命名一个创建的变量通常不是一个好方法

但本着实际回答问题并相信作者(和读者)知道何时以及是否合适的精神,这是实现相同目标的另一种方法:

l1 = ['a', 'b', 'foo']
l2 = ['c', 'd', 'bar']
l3 = ['e', 'f', 'baz']

lists_to_rename = [l1, l2, l3]

for some_list in lists_to_rename:
    exec("%s = some_list"%(some_list[2]))

print foo, bar, baz
我再说一遍:我不赞成这样做;这几乎肯定不是解决你问题的正确方法。为了完整性和未来的参考能力,我喜欢尝试回答前面提到的问题。

事实上,globals()是一个包含变量的dict。但是用手更新它不是个好主意。您应该创建自己的dict,其中键是第三级变量,值是列表。或者您可以创建一些简单的类,因为在您可以使用列表中的属性更新此类中的对象之后:

class A(object):
    pass

a = A()
list_of_lists = [["a", "b", "c", "d"], ["d", "e", "j", "k"]]
map(lambda elem: setattr(a, elem[2], elem), list_of_lists)
a.__dict__     # Out[]: {'c': ['a', 'b', 'c', 'd'], 'j': ['d', 'e', 'j', 'k']}
但是这样你就不能做一些奇怪的事情!(你想要一些奇怪的东西,对吗?) 有了迪克特你可以

a = {}
list_of_lists = [["a", "b", "c", "d"], [1, 2, 3, 4], [lambda x:x, lambda x: x * x, lambda x: lambda y: x + y]]
for elem in list_of_lists:
    a[elem[2]] = elem

# {3: [1, 2, 3, 4],
#  <function __main__.<lambda>>: [<function __main__.<lambda>>,
# <function __main__.<lambda>>,
# <function __main__.<lambda>>],
# 'c': ['a', 'b', 'c', 'd']}
a={}
列表中的列表=[“a”、“b”、“c”、“d”]、[1、2、3、4],[lambda x:x,lambda x:x*x,lambda x:lambda y:x+y]]
对于列表中的元素,列表中的元素:
a[elem[2]]=elem
# {3: [1, 2, 3, 4],
#  : [,
# ,
# ],
#'c':['a','b','c','d']}
事实上,globals()是一个包含变量的dict。但是用手更新它不是个好主意。您应该创建自己的dict,其中键是第三级变量,值是列表。或者您可以创建一些简单的类,因为在您可以使用列表中的属性更新此类中的对象之后:

class A(object):
    pass

a = A()
list_of_lists = [["a", "b", "c", "d"], ["d", "e", "j", "k"]]
map(lambda elem: setattr(a, elem[2], elem), list_of_lists)
a.__dict__     # Out[]: {'c': ['a', 'b', 'c', 'd'], 'j': ['d', 'e', 'j', 'k']}
但是这样你就不能做一些奇怪的事情!(你想要一些奇怪的东西,对吗?) 有了迪克特你可以

a = {}
list_of_lists = [["a", "b", "c", "d"], [1, 2, 3, 4], [lambda x:x, lambda x: x * x, lambda x: lambda y: x + y]]
for elem in list_of_lists:
    a[elem[2]] = elem

# {3: [1, 2, 3, 4],
#  <function __main__.<lambda>>: [<function __main__.<lambda>>,
# <function __main__.<lambda>>,
# <function __main__.<lambda>>],
# 'c': ['a', 'b', 'c', 'd']}
a={}
列表中的列表=[“a”、“b”、“c”、“d”]、[1、2、3、4],[lambda x:x,lambda x:x*x,lambda x:lambda y:x+y]]
对于列表中的元素,列表中的元素:
a[elem[2]]=elem
# {3: [1, 2, 3, 4],
#  : [,
# ,
# ],
#'c':['a','b','c','d']}

我是这样解决的:

for row in rows:
    print '{0}-{1}={2:.1f}'.format(row[3], row[2], row[1])

我是这样解决的:

for row in rows:
    print '{0}-{1}={2:.1f}'.format(row[3], row[2], row[1])


你试过什么吗?我们可以帮助您使用语法。通常,动态创建具有特定名称的变量是错误的答案,请改用字典。“…取其包含的第三个值的名称…”啊,什么?请发布您的代码。我们不是读心术的人。虽然有些可能是,但它们仍然不会帮助您,直到您发布代码。“我需要它们中的每一个都使用它包含的第三个值的名称”-值的名称是什么?值通常没有变量名以外的“名称”,但在本例中,它是一个列表,因此它没有名称,只有一个索引。你需要澄清一下,你试过什么吗?我们可以帮助您使用语法。通常,动态创建具有特定名称的变量是错误的答案,请改用字典。“…取其包含的第三个值的名称…”啊,什么?请发布您的代码。我们不是读心术的人。虽然有些可能是,但它们仍然不会帮助您,直到您发布代码。“我需要它们中的每一个都使用它包含的第三个值的名称”-值的名称是什么?值通常没有变量名以外的“名称”,但在本例中,它是一个列表,因此它没有名称,只有一个索引。你需要在这里澄清。如果这还不够,还有一些建议:“你认为你想做这个答案所说的,但实际上你想做这个答案所建议的字典所说的”。+1用于展示如何做。。。即使这通常是一个(非常)坏的主意(我想这类事情可能会有一些潜在的用例),一些元编程应用程序也能很好地解决这类问题。人们通常会将所有内容封装到一个装饰器或其他东西中,然后装饰器可以像标记一样注入功能或创建大量附加功能,而无需额外编程。如果这还不够,还有一些建议:“你认为你想做这个答案所说的,但实际上你想做这个答案所建议的字典所说的”。+1用于展示如何做……即使这通常是一个(非常)坏的主意(我想这类事情可能有一些潜在的使用案例)有些元编程应用程序很好地解决了这类问题。人们通常会将所有的元编程应用程序封装到一个装饰器或其他东西中,然后装饰器可以像标记一样注入功能或创建大量的附加功能,而无需额外编程。相关的
dict
也可能是
locals()
如果发生重命名的位置不在glob