1

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

但我不能把 row[3] 的值放在我需要的地方

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

不工作

4

4 回答 4

7
all_my_lists = {} #USE A DICT!!!
all_my_list[listx[2]] = listx  #listx[2] gives the 3rd value in listx

我认为这就是你要找的东西......如果你真的想设置变量名,你需要弄乱 locals() 和 globals() ......这很恶心

于 2013-10-31T18:06:04.013 回答
2

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

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

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

我再说一遍:我不赞同这个好;这几乎肯定不是解决问题的正确方法。为了完整性和未来的参考能力,我只是想尝试回答上述问题。

于 2013-10-31T18:14:56.213 回答
0

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

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']}
于 2013-10-31T18:25:56.397 回答
0

好吧,我是这样解决的:

for row in rows:
    print '{0}-{1}={2:.1f}'.format(row[3], row[2], row[1])
于 2013-11-01T11:50:16.947 回答