我正在寻找一种在python中生成代码的简单方法

时间:2013-03-13 00:42:16

标签: python scripting

所以我基本上有一个非常大的具有相似名称的元素列表(c0,d0,c1,d1 ......等)

我想知道是否有一种更简单的方法可以生成一个脚本来使用字符串生成每个元素

将字符串“c0”更改为实际变量c0

我想避免使用列表而宁愿生成代码,原因与我的项目相关

谢谢你们!

4 个答案:

答案 0 :(得分:2)

首先,不要采取错误的方式,但我假设你是基于你的问题代码的Python新手:它不是有效的Python。这里有大量精彩的Python教程 - 阅读Python函数,内置函数和一般哲学。它是一种非常强大的语言,但它看起来像你继承的脚本......不是非常Pythonic。一定不要从中学到错误的语言。

因此,理想情况下,您希望在某种数据结构中收集所有这些变量。 Python有很多不同的类型。

如果您只需要比较一对固定数据集中的每个索引,就可以使用元组:这些是有序的,不可变的集合,暗示了一些结构。假设您有 n 数据对:您有两个元组,我们称之为 c d ,但使用描述性名称显然更好如果你可以的话。它看起来像这样:

c = (c0, c1, c2, ... cn)
d = (d0, d1, d2, ... dn)

你要将它们与这样的东西进行比较:

for i in range(len(c)):
    if c[i] == d[i]:
        print '%d: match' % i
    else:
        print '%d: no match' % i

(两个注释:len()找到一个对象的长度,range()创建一个可整合的序列 - 你的问题使用len(),你想在Python中使用range()。另外,% d stuff只是字符串格式化。)

我的假设是你需要更多。首先,如果编写这个东西的人认为将数据存储为数百个独特的全局变量是一个好主意,我不会认为他会在运行时确保每个变量都存在并保存数据等。所以我个人在这种情况下使用字典,因为它给你更多的灵活性。

每个dict都是key:value对的集合。 Dicts是无序的,所以你不能直接比较每一个中的第一个项目 - 没有第一个项目。你可以做的是使用整数序列作为键,然后遍历该序列的范围。并且您可以执行诸如使用默认值检索值的操作,因此如果c64从未声明,则不会使程序崩溃:

c = {0:'a', 1:'b', 2:'c', 3:'d', 4:'r'}
d = {0:'a', 1:'B', 2:None, 3:'d'}

然后像:

for i in range(len(c)):
    if c.get(i, 'No value') == d.get(i, 'No value'):
        print '%d: match' % i
    else:
        print '%d: no match' % i

虽然您通常会从c[4]d['apple']这样的字典中检索数据。如果缺少 i 的某些值,Get()允许我们使用默认值(“无值”)。

(另一个假设:每对数据代表一些真实的数据关系,因此迭代的数量在语义上与标签一样多。在我看来,键通常应该是标签而不是值本身。 )

您在评论中建议的,将现有变量收集到其中一个结构中,可以正常工作。只需打开Notepad ++并使用您的源代码进行智能搜索/替换,您需要花费十分钟时间。如果找到符合您需求的其他结构,您最终会得到c = (c0, c1, c2, etc)c = {0:c0, 1:c1, etc}或其他不同的结果。但我真正认为你应该做的是重构整个脚本,以便你比较的数据存储在反映它是什么以及你如何使用它的某种对象中。 Python会让你在这里发挥真正的魔力:通过一些小工作,你可以做一些像c == d这样简单的事情,找到 c d <的联合或不相交的集合/ em>,在某些迭代中操纵数据值,或者你需要的任何东西。

答案 1 :(得分:-1)

您实际上可以使用vars(),文档here

以字符串格式声明变量

例如,

如果我有列表,names

names = ['a','b','c','d']

我能做到:

for i,k in enumerate(names):
    vars()[k] = i*2 #k is the names

>>>print a
0
>>>print b
2
>>>print c
4

修改

使用exec文档here

还有另一种方法
for i,k in enumerate(names):
    exec(k + '=%s' % i)  #k is the names

>>>print a
0
>>>print b
1
>>>print c
2

答案 2 :(得分:-1)

查看getattrlocalsglobals

如果您的变量是函数的本地变量,那么您可以这样做。如果您的变量是全局变量,请使用globals()

for i in len(100):
    first_name = "c{0}".format(i)
    second_name = "d{0}".format(i)
    if(locals()[first_name] == locals()[second_name]):
        print("hello")

答案 3 :(得分:-1)

您可以使用评估功能:

for i in xrange(100):
    if eval('c%d' % i) == eval('d%d' % i):
        print "Hello!"