I';我正在寻找一种用python生成代码的简单方法

I';我正在寻找一种用python生成代码的简单方法,python,scripting,Python,Scripting,因此,我基本上有一个非常大的元素列表,这些元素具有相似的名称(c0、d0、c1、d1…等等) 我想知道是否有一种更简单的方法可以生成一个脚本来使用字符串生成这些元素 这会将字符串“c0”更改为实际变量c0 出于与我的项目相关的原因,我希望避免使用列表,而是生成代码 谢谢大家 看看,然后 如果你的变量是函数的局部变量,你可以这样做。如果变量是全局变量,请使用globals() for i in len(100): first_name = "c{0}".format(i) seco

因此,我基本上有一个非常大的元素列表,这些元素具有相似的名称(c0、d0、c1、d1…等等)

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

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

出于与我的项目相关的原因,我希望避免使用列表,而是生成代码

谢谢大家

看看,然后

如果你的变量是函数的局部变量,你可以这样做。如果变量是全局变量,请使用
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")

您可以使用eval功能:

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

首先,请不要误解这一点,但我假设您是Python新手,基于您问题中的代码:它不是有效的Python。到处都有很多很棒的Python教程——阅读Python函数、内置函数和一般原理。这是一种非常强大的语言,但看起来您继承的脚本是。。。不是很像蟒蛇。一定不要从中学到关于语言的错误的东西

因此,理想情况下,您希望所有这些变量都收集在某种数据结构中。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
你可以将它们与这样的东西进行比较:

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内容只是字符串格式。)

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

每个dict都是键:值对的集合。Dicts是无序的,因此您不能直接比较每个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
尽管您通常会从dict中检索数据,如
c[4]
d['apple']
。Get()允许我们使用默认值(“No value”),以防i的某些值丢失

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


您在评论中建议的方法,将现有变量收集到这些结构中的一个中,可以很好地工作。只需打开记事本++并对源代码进行智能搜索/替换,应该需要10分钟。如果您找到另一个适合您的需要的结构,您将得到
c=(c0、c1、c2等)
c={0:c0、1:c1等
,或者其他不同的结构。但是我真正认为你应该做的是重构整个脚本,这样你比较的数据就会存储在某种对象中,反映出它是什么以及你如何使用它。Python将让您在这里发挥真正的魔力:通过一点腿部工作,您可以做一些简单的事情,比如
c==d
,找到c和d的联合或不联合集,在某些迭代中操作数据值,或者做任何您需要的事情。

现在您让我思考这些原因到底是什么,不用说,如果你有100个类似命名的变量,那么很有可能有更好的方法来解决顶级问题……你能解释一下为什么要使用代码生成吗?代码生成可能不是这个问题的最佳解决方案。这些元素实际上是在Python列表或其他数据结构中收集的吗?或者它们只是一百个不相关的变量?嗯。。。列表元素没有名称,它们有值。谢谢你!我对python还不太熟悉,事实上我知道这不是真正的python,我最初是正确编写的,我意识到它没有传达我想要传达的想法。我想写一本字典可能是我在这里的最佳选择。多谢各位@DanielImberman很好,我很高兴这让你走上了正轨。我建议对您的问题进行一点编辑,以反映您真正想要处理的是一个在无组织数据方面做得很差的脚本,而不是代码生成本身。你可能会得到更多关于如何解决问题的建议。