我需要在python中操作几个列表,我需要每个列表都包含它包含的第3个值的名称,但是我无法解决这个问题的语法。
由于
编辑:
我正在为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)
但是我不能把row [3]的值放在我需要它的地方
print 'row[3]={0:.1f}{1}' .format(row[0],row[1])
不起作用
答案 0 :(得分:6)
all_my_lists = {} #USE A DICT!!!
all_my_list[listx[2]] = listx #listx[2] gives the 3rd value in listx
我认为你正在寻找...如果你真的想设置变量名,你需要搞乱locals()和globals()......这是粗略的
答案 1 :(得分:1)
我同意其他评论者动态命名创建的变量通常不是一个好方法。
但本着实际回答问题并信任作者(和读者)知道何时以及是否合适的问题,这是实现同一目标的另一种方法:
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
我重复:我并不认同这一点;几乎肯定不是解决问题的正确方法。我只想尝试回答所陈述的问题,以确保完整性和未来的参考能力。
答案 2 :(得分:0)
实际上,globals()是一个包含变量的字典。但手动更新并不是一个好主意。您应该创建自己的dict,键是第3级变量,值是列表。或者您可以创建一些简单的类,因为您可以使用列表中的属性更新此类中的对象:
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']}
但是这种方式你不能做一些奇怪的事情! (你想要一些奇怪的东西,我是对的吗?)
用dict你可以!
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']}
答案 3 :(得分:0)
好吧,我解决了这个问题:
for row in rows:
print '{0}-{1}={2:.1f}'.format(row[3], row[2], row[1])