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

时间:2013-10-31 18:03:37

标签: python

我需要在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])

不起作用

4 个答案:

答案 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])